定义一个委托调用的方法:TakesAWhile
- //定义委托要引用的方法
- private static int TakesAWhile(int data, int ms)
- {
- Console.WriteLine("开始...");
- //当前线程(委托线程)阻塞ms毫秒
- Thread.Sleep(ms);
- Console.WriteLine("完成!");
- return ++data;
- }
//定义委托要引用的方法 private static int TakesAWhile(int data, int ms) { Console.WriteLine("开始..."); //当前线程(委托线程)阻塞ms毫秒 Thread.Sleep(ms); Console.WriteLine("完成!"); return ++data; }
定义一个委托:
- public delegate int TakesAWhileDelegate(int data, int ms);
public delegate int TakesAWhileDelegate(int data, int ms);
以下是异步调用委托的3种方式:
1.投票
- /* 异步调用委托之:投票,检查委托是否完成任务 star */
- TakesAWhileDelegate d1 = TakesAWhile;
- IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
- //检查委托是否完成
- while (!ar.IsCompleted)
- {
- Console.WriteLine(".");
- //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"."
- Thread.Sleep(500);
- }
- //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
- int result = d1.EndInvoke(ar);
- Console.WriteLine("结果:" + result);
- /*
/* 异步调用委托之:投票,检查委托是否完成任务 star */ TakesAWhileDelegate d1 = TakesAWhile; IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null); //检查委托是否完成 while (!ar.IsCompleted) { Console.WriteLine("."); //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"." Thread.Sleep(500); } //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果 int result = d1.EndInvoke(ar); Console.WriteLine("结果:" + result); /*
2.等待句柄
- /* 异步调用委托之:等待句柄 star */
- TakesAWhileDelegate d1 = TakesAWhile;
- IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
- while (true)
- {
- Console.WriteLine(".");
- //AsyncWaitHandle访问等待句柄
- //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环
- if (ar.AsyncWaitHandle.WaitOne(500, false))
- {
- Console.WriteLine("可获得结果啦Baby!");
- break;
- }
- }
- //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果
- int result = d1.EndInvoke(ar);
- Console.WriteLine("结果:" + result);
- /* 异步调用委托之:等待句柄 end */
/* 异步调用委托之:等待句柄 star */ TakesAWhileDelegate d1 = TakesAWhile; IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null); while (true) { Console.WriteLine("."); //AsyncWaitHandle访问等待句柄 //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环 if (ar.AsyncWaitHandle.WaitOne(500, false)) { Console.WriteLine("可获得结果啦Baby!"); break; } } //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果 int result = d1.EndInvoke(ar); Console.WriteLine("结果:" + result); /* 异步调用委托之:等待句柄 end */
3.异步回调
- //定义委托调用完毕后的回调方法
- private static void TakesAWhileCommpleted(IAsyncResult ar)
- {
- if (ar == null)
- {
- throw new ArgumentException("ar");
- }
- TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;
- int result = d1.EndInvoke(ar);
- Console.WriteLine("结果:" + result);
- }
//定义委托调用完毕后的回调方法 private static void TakesAWhileCommpleted(IAsyncResult ar) { if (ar == null) { throw new ArgumentException("ar"); } TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate; int result = d1.EndInvoke(ar); Console.WriteLine("结果:" + result); }
- /* 异步调用委托之:异步回调 star */
- TakesAWhileDelegate d1 = TakesAWhile;
- d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1);
- for (int i = 0; i < 100; i++)
- {
- Console.WriteLine(".");
- Thread.Sleep(500);
- }
- /* 异步调用委托之:异步回调 end */
/* 异步调用委托之:异步回调 star */ TakesAWhileDelegate d1 = TakesAWhile; d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1); for (int i = 0; i < 100; i++) { Console.WriteLine("."); Thread.Sleep(500); } /* 异步调用委托之:异步回调 end */
注:异步模式,不仅用于委托,异步模式在.NET Framework的各个地方都能见!