您的位置:首页 > 职场人生

关于异步委托调用

2010-08-07 12:17 176 查看
关于异步委托调用
看个例子:
delegate void SendDel(string mes);//定义一个发送邮件委托
delegate void ReceiveDel();//定义一个接收委托
class Program
{
static void Main(string[] args)
{
//实例委托,执行异步委托
SendDel sd = new SendDel(SendMessage);
IAsyncResult result = sd.BeginInvoke("你请我吃饭吧!", null, null);
while (result.IsCompleted)
{
Console.WriteLine("*******");
sd.EndInvoke(result);
break;
}
ReceiveDel rd = new ReceiveDel(Receive);
IAsyncResult reresult = rd.BeginInvoke(null, null);
while (reresult.IsCompleted)
{
Console.WriteLine("@@@@@@@@@@@@@@@@@@@");
rd.EndInvoke(reresult);
break;
}
Console.Read();
}
/// 定义接收方法
static void Receive()
{
Console.WriteLine("将要接收邮件");
for (int i = 0; i < 10; i++)
{
Console.WriteLine("正在接收第{0}封邮件", i + 1);
Thread.Sleep(500);
}
}
/// 定义发送邮件方法
static void SendMessage(string mesage)
{
Console.WriteLine("将要发送:{0}", mesage);
for (int i = 0; i < 10; i++)
{
Console.WriteLine("正在发送……");
Thread.Sleep(1000);
}
Console.WriteLine("发送完毕");
}
}
关于这个例子中用于鉴别线程执行完的 Console.WriteLine("*******")和Console.WriteLine("@@@@@@@@@@@@@@@@@@@")两行代码是永远不会打印的,因为主线程是main方法,执行很快,当他走到console.Read()的时候可能才在发送或接受第一两封邮件,异步操作并不会完成,然后再等待Read()的时候两个异步委托才走完。如果没有 Console.Read()这行代码,则程序运行结果就是直接看到

……

关于为什么要用它,通常情况下,如果需要异步执行一个耗时的操作,我们会新起一个线程,然后让这个线程去执行代码。但是对于每一个异步调用都通过创建线程来进行操作显然会对性能产生一定的影响,同时操作也相对繁琐一些。通过委托进行方法的异步调用,就是说客户端在异步调用方法时,本身并不会因为方法的调用而中断,而是从线程池中抓取一个线程去执行该方法,自身线程(主线程)在完成抓取线程这一过程之后,继续执行下面的代码,这样就实现了代码的并行执行。使用线程池的好处就是避免了频繁进行异步调用时创建、销毁线程的开销。
如同上面所示,当我们在委托对象上调用BeginInvoke()时,便进行了一个异步的方法调用。
异步委托在系统线程池中,而不是自定义的线程池。通常,系统线程池比较小,过于小,因此仅适合非常快结束的线程。
一般善于设计异步程序的人,往往都是采用回调来处理程序流程。触发异步委托的线程结束了,只要应用程序没有结束,回调就会照常发生。
异步委托虽然在背后也使用了线程,但它是线程安全的,如果自己弄一个线程的话,要考虑各种因素,
所以能用异步委托的话,还是优先使用异步委托,当然轻便是有代价的,你无法像自己弄个线程那样,可以完全控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 异步委托