关于异步委托调用
看个例子:
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);
{
Console.WriteLine("正在发送……");
Thread.Sleep(1000);
}
Console.WriteLine("发送完毕");
}
关于这个例子中用于鉴别线程执行完的 Console.WriteLine("*******")和Console.WriteLine("@@@@@@@@@@@@@@@@@@@")两行代码是永远不会打印的,因为主线程是main方法,执行很快,当他走到console.Read()的时候可能才在发送或接受第一两封邮件,异步操作并不会完成,然后再等待Read()的时候两个异步委托才走完。如果没有 Console.Read()这行代码,则程序运行结果就是直接看到
![关于异步委托调用_休闲](https://s2.51cto.com/attachment/201008/201008071281154400171.jpg?x-oss-process=image/resize,m_fixed,w_1184)
关于为什么要用它,通常情况下,如果需要异步执行一个耗时的操作,我们会新起一个线程,然后让这个线程去执行代码。但是对于每一个异步调用都通过创建线程来进行操作显然会对性能产生一定的影响,同时操作也相对繁琐一些。通过委托进行方法的异步调用,就是说客户端在异步调用方法时,本身并不会因为方法的调用而中断,而是从线程池中抓取一个线程去执行该方法,自身线程(主线程)在完成抓取线程这一过程之后,继续执行下面的代码,这样就实现了代码的并行执行。使用线程池的好处就是避免了频繁进行异步调用时创建、销毁线程的开销。
如同上面所示,当我们在委托对象上调用BeginInvoke()时,便进行了一个异步的方法调用。
异步委托在系统线程池中,而不是自定义的线程池。通常,系统线程池比较小,过于小,因此仅适合非常快结束的线程。
一般善于设计异步程序的人,往往都是采用回调来处理程序流程。触发异步委托的线程结束了,只要应用程序没有结束,回调就会照常发生。