异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它。 .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/jes_shaw/archive/2013/03/12/2956005.html

C#异步编程的实现方式(1)——异步委托相关推荐

  1. 异步编程的实现方式以及区别

    1.异步编程的实现方式? JavaScript中的异步机制可以分为以下几种: ━ 回调函数的方式,使用回调函数的方式有一个缺点是,多个回调函数嵌套的时候会造成回调地狱,上下两层的回调函数间的代码耦合度 ...

  2. 【转】1.7异步编程:基于事件的异步编程模式(EAP)

    传送门:异步编程系列目录-- 上一篇,我给大家介绍了".NET1.0 IAsyncResult异步编程模型(APM)",通过Begin*** 开启操作并返回IAsyncResult ...

  3. 深入理解python异步编程_深入理解Python异步编程

    1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...

  4. rust异步编程--理解并发/多线程/回调/异步/future/promise/async/await/tokio

    1. 异步编程简介 通常我们将消息通信分成同步和异步两种: 同步就是消息的发送方要等待消息返回才能继续处理其它事情 异步就是消息的发送方不需要等待消息返回就可以处理其它事情 很显然异步允许我们同时做更 ...

  5. python3异步编程_协程 Python异步编程(asyncio)

    协程(Coroutine) 也可以被称为微线程,是一种用户态内的上下文切换技术.简而言之,其实就是通过一个线程实现代码块相互切换执行. 直接上代码,例如: 同步编程 import time def f ...

  6. [转]C#异步编程的实现方式(1)——异步委托

    异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它. .Net Framework已经为我们提供了委托的异步调用方法.下面介绍三种使用委托实现异步的方法. 1.投票(IsComplet ...

  7. C#异步编程的实现方式(4)——Task任务

    .Net Framework 4.0新增了一个System.Threading.Tasks命名空间,它包含的类提供了任务的相关操作.使用任务不仅可以获得一个抽象层,还能对底层线程进行很多统一的控制操作 ...

  8. C#异步编程的实现方式(6)——层次任务

    任务也可以构成一个层次结构.一个任务启动一个新任务时,就启动了一个层次结构.下面的代码段在父任务内部新建一个任务.创建子任务的代码与创建父任务的代码相同,唯一的区别是这个任务从另一个任务内部创建: 1 ...

  9. C#异步编程(一):异步基础

    class Program{static void Main(string[] args){var result = DownloadStringWithTimeout("http://ww ...

最新文章

  1. 波段 ku_X和Ku波段小尺寸无线电设计
  2. H3C设备之RIP v2认证
  3. python每天定时9点执行_python 定时器每天就执行一次的实现代码
  4. python核心编程第六章练习6-12
  5. tuning-primer.sh 性能调试工具的使用
  6. springboot使用jsp完成数据的页面展示
  7. HTML5新增音频标签(HTML5)
  8. 江苏计算机二级vb,江苏省计算机等级考试二级vb.ppt
  9. 苹果手机壳_潮牌刺绣苹果8 Plus手机壳,让爱机焕然一新
  10. 2020-07-07
  11. WampServer 不能打开phpmyadmin 的解决办法
  12. java spark 项目_spark应用程序如何在Java项目中运行
  13. API Guides Contacts Provider
  14. 查看抽取解压缩和修改war包
  15. python计算器算法_Python数学运算入门把Python当作计算器
  16. c语言负数左移右移_C语言负数的移位运算
  17. IDEA中实现自动导包
  18. c语言社团管理系统实验报告,C语言课程设计大学社团管理系统
  19. aso优化师是什么_【aso优化师赵星凯】简述为什么要做aso?
  20. 2016年智能楼宇趋势展望

热门文章

  1. eclipse断点调试 出现Source not found
  2. 很棒的在线裁图工具jQuery1.4.2 + jquery.bitmapcutter.js + BitmapCutter.Core+的完美配合
  3. 在LINUX环境中,哪种文件系统存储更安全?
  4. ROS 2 index翻译(七)——用Colcon编译功能包(package)
  5. [转]12款最佳Linux命令行终端工具
  6. Nginx笔记系列(1)——Nignx的安装部署
  7. 《神探tcpdump第四招》-linux命令五分钟系列之三十八
  8. Mysql中NUMERIC和DECIMAL类型区别比较
  9. Buffer Cache Hit Ratio
  10. 浏览器本地存储的使用