[转]C#异步编程的实现方式(1)——异步委托
异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它。 .Net Framework已经为我们提供了委托的异步调用方法。下面介绍三种使用委托实现异步的方法。
1、投票(IsCompleted属性)
首先定义一个委托:
1: public delegate string MyDelegate(int ms);Delegate类提供了BeginInvoke()方法,这个方法返回一个IAsyncResult接口,这个接口包含了该委托的相关信息,并且可以通过它的IsCompleted属性来判断该委托是否执行完成。下面是将要异步调用的方法:
1: static string DelegateMethod(int ms) 2: { 3: Console.WriteLine("TakesAWhile started"); 4: Thread.Sleep(ms); 5: Console.WriteLine("TakesAWhile completed"); 6: return "Hello world!"; 7: }下面是主线程的方法:
1: static void Imp1() 2: { 3: MyDelegate dl = DelegateMethod; 4: 5: IAsyncResult ar = dl.BeginInvoke(5000, null, null); 6: 7: while (!ar.IsCompleted) 8: { 9: Console.Write("."); 10: Thread.Sleep(50); 11: } 12: string result = dl.EndInvoke(ar); 13: Console.WriteLine("result: {0}", result); 14: }可以看到,委托线程执行5秒钟,主线程不停的循环判断委托线程是否完成(用IsCompleted属性判断)。如果没完成则断续打点,如果完成则跳出循环。用EndInvoke方法获取委托的返回值。如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。
2、等待句柄(AsyncWaitHandle属性)
使用IAsyncResult的AsyncWaitHandle属性可以访问等待句柄,这个属性返回一个WaitHandle对象,这个对象的WaitOne()方法可输入一个超时时间作为参数,设置等待的最长时间。如果超时,WaitOne()方法返回一个bool值,true为等待成功(即委托完成),异步调用的方法与上面一样,下面是主线程实现:
1: static void Imp2() 2: { 3: MyDelegate dl = DelegateMethod; 4: 5: IAsyncResult ar = dl.BeginInvoke(5000, null, null); 6: while (true) 7: { 8: Console.Write("."); 9: if (ar.AsyncWaitHandle.WaitOne(50)) 10: { 11: Console.WriteLine("Can get the result now"); 12: break; 13: } 14: } 15: string result = dl.EndInvoke(ar); 16: Console.WriteLine("result: {0}", result); 17: } 主线程每等待50秒做一次判断是否完成。 3、异步回调(AsyncCallBack委托) BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现: 1: static void Imp3() 2: { 3: MyDelegate dl = DelegateMethod; 4: dl.BeginInvoke(5000, new AsyncCallback(ar => 5: { 6: string result = dl.EndInvoke(ar); 7: Console.WriteLine("result: {0}", result); 8: }), null); 9: for (int i = 0; i < 100; i++) 10: { 11: Console.Write("."); 12: Thread.Sleep(50); 13: } 14: } BeginInvoke方法的最后一个参数可以用IAsyncResult的AsyncState属性获取。 参考资料:《C#高级编程》 本文源代码: 原文链接:http://www.cnblogs.com/sosowjb/archive/2012/08/10/2631161.html转载于:https://www.cnblogs.com/ppcompany/articles/2633743.html
总结
以上是生活随笔为你收集整理的[转]C#异步编程的实现方式(1)——异步委托的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 动态加载javascript
- 下一篇: 拉登游戏开发--C#实现过程