(转) C#如何使用异步编程

怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法。委托类有两个方法,叫做BeginInvoke和EndInvoke,它们是用来异步执行使用。

异步有三种模式

  1. 等待模式,在发起了异步方法以及做了一些其它处理之后,原始线程就中断,并且等待异步方法完成之后再继续。
  2. 轮询模式,原始线程定期检查发起的线程是否完成,如果没有则可以继续做一些其它的事情。
  3. 回调模式,原始线程一直在执行,无需等待或检查发起的线程是否完成。在发起的线程中的引用方法完成之后,发起的线程就会调用回调方法,由回调方法在调用EndInvoke之前处理异步方法的结构。

在学习异步编程之前,先看看BeginInvoke和EndInvoke方法。

BeginInvoke方法

  1. 在调用BeginInvoke时,参数列表中的实参组成如下:

    1)  引用方法需要的参数。

    2)  两个额外的参数——callback参数和state参数。

  1. BeginInvoke从线程池中获取一个线程并且在新的线程开始时运行引用方法。
  2. BeginInvoke返回给调用线程一个实现IasyncResult接口的对象。这个接口引用包含了异步方法的当前状态,原始线程然后可以继续执行。

EndInvoke方法

  1. 它接受一个由BeginInvoke方法返回的IasyncResult对象的引用,并找到它关联的线程。
  2. 如果线程池的线程已经退出,EndInvoke做如下的事情。

    1)  它清理退出线程的状态并且释放它的资源。

    2)  它找到引用方法返回的值并且把它的值作为返回值。

  1. 如果当EndInvoke被调用时线程池的线程仍然在运行,调用线程就会停止并等待,直到清理完毕并返回值。因为EndInvoke是为开启的线程进行清理,所以必须确保对每一个BeginInvoke都调用EndInvoke。
  2. 如果异步方法触发了异常,在调用EndInvoke时会抛出异常。

等待模式

在这种模式里,原始线程发起一个异步方法的调用,做一些其它处理,然后停止并等待,直到开启的线程结束。如下图

 

 

 

 

这段代码产生了如下输出。

 

 

  既然我们已经看到了BeginInvoke和EndInoke的最简单形式,可以进一步了解IasyncResult了,它是使用这些方法的必要部分。

BeginInvoke返回一个IasyncResult接口的引用(内部是AsyncResult类的对象)。AsyncResult类表现了异步方法的状态。如下图:

 

  1. 当我们调用委托对象的BeginInvoke方法时,系统创建了一个AsyncResult类的对象。然而,它不返回类的对象的引用,而是返回对象中包含的IasyncResult接口的引用。
  2. AsyncResult对象包含一个叫做AsyncDelegate的属性,它返回一个指向被调用来开启异步方法的委托的引用。但是这个属性是类对象的一部分而是接口的一部分。
  3. IsCompleted属性返回一个布尔值,表示异步方法是否完成。
  4. AsyncState属性返回一个对象的引用,它被作为BeginInvoke方法调用时的state参数。它返回object类型的引用,稍后再讲解。。

轮询模式

  在轮询模式中,原始线程发起了异步方法的调用,做一些其它处理,然后使用IAsyncResult对象的IsCompleted属性来定期检查开启的线程是否完成。如果异步方法已经完成,原始线程就调用EndInvoke并继续。否则,它做一些其它处理,然后过一会儿再检查。如下图:

 

这段代码产生了如下输出。

 

 

回调模式

  在之前的等待模式与轮询模式中,初始线程继续它自己的控制流程,直到它知道开启的线程完成。然后,它获取结果并继续。

  回调模式的不同之处在于,一旦初始线程发起了异步方法,它就自己管自己了,不再考虑同步。当异步方法调用结束之后,系统调用一个用户自定义的方法来处理结束,并且调用委托的EndInvoke方法。这个用户自定义的方法叫做回调方法或回调。

  BeginInvoke的参数列表中最后的两个额外参数被回调方法用做:

    1)  第一个参数,callback参数,是回调方法的名字。

    2)  第二个参数,state参数,可以是null或要传入回调方法的一个对象数据。我们可以通过使用IAsyncResult参数的AsyncState属性来获取这个对象。参数类型是object

  1. 回调方法的签名和返回类型必须和AsyncCallback委托类型所描述的形式一致。它需要方法接受一个IAsyncResult作为参数并且返回类型是void。如下所示:

Void AsyncCallback(IAsyncResult iar)

  1. 在回调方法内,我们的代码应该调用委托的EndInvoke方法来处理异步方法执行后的输出值。要调用委托的EndInvoke方法,我们肯定需要委托对象的引用,而它在初始线程中,不在开启线程中。如果我们不使用BeginInvoke的state参数作其它的用途,可以使用它发送委托的引用给回调方法。否则,我们可以从发送给方法作为参数的IAsyncResult对象中提取出委托的引用。

    1)  给回调方法的参数只有一个,就是刚结束的异步方法的IAsyncResult接口的引用,要记住,IAsyncResult接口对象在AsyncResult类对象的内部。

    2)  尽管IAsyncResult接口没有委托对象的引用,而包含它的AsyncResult类对象却有委托对象的引用。

    3)  有了类对象的引用,我们现在就可以调用类对象的AsyncDelegate属性并且把它转化为合适的委托类型。这样就得到了委托引用,我们可以用它来调用EndInvoke。

如下代码所示:

 

 

 

 

这段代码产生了如下输出。

 

那么以上的异步内容已经基本讲解完毕。

说明:异步编程在.Net4.0中,有了更好的方式处理,简化了编程的复杂度,使用Task类(在System.Threading.Tasks命名空间中)处理,但原理是一样的。

转载于:https://www.cnblogs.com/atuotuo/p/4813818.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript 的 ~ 操作符作用

2019独角兽企业重金招聘Python工程师标准>>> "~" operator in javascript. For anyone else who also didnt know what it does: it converts -1 to 0,可以节省用来比较-1的情况,如 if (~event.origin.indexOf(http://yoursite.com…

驻定相位原理(POSP)以及线性调频信号的频谱

最近看论文遇到了驻定相位原理,问老师直接给了我一本书让我看,看半天只有一段…不是这个方向的,半路出家做毕业设计需要用到这个定理,有错误的话请不吝赐教。 一、驻定相位原理 在数字信号处理中,经常需要将一个时域…

vue怎么合并两个视频_【软件分享】视频分割合并软件哪款好用呢?怎么剪切合并视频?...

现在有很多小伙伴都喜欢喜欢自己拍视频上传到各大视频平台,有时候会遇到关于视频剪辑方面的难题,比如说,视频怎么剪切?怎么将两段小视频合并成一个呢?这些都是一些比较常常遇到的问题,今天小编就给大家介绍…

怎样根据字段域查找到其在数据库中关系与属性

Infor SyteLine ERP中,很多时候需要做维护,我们需要从打开的window窗口的form中某一个输入Textbox域或是DropDownList域,去找到它是绑定了数据库中的哪一张表,哪一个字段的? 其相关的关系或是属性等。比如下面这个form…

【手势交互】9. PS Move

索尼研发体感控制技术已有10年,在过去那么多年里。尝试了3D摄像头、超声波和电磁感应等各种技术。最后还是觉得眼下的MOVE所使用的技术最为合适。PS Move是索尼于2010年9月份推出。用来让PS3主机具备动态感应功能的控制器。他利用动态控制器(手柄&#x…

多普勒效应及多普勒频移的简单推导

多普勒效应及多普勒频移的简单推导 fd≡fR−fT(1)f_d\equiv f_R-f_T \tag{1} fd​≡fR​−fT​(1)   式中,fdf_dfd​表示多普勒频移,fRf_RfR​表示目标回波的频率(Hz),fTf_TfT​表示发射信号的频率(Hz)。 多普勒频移…

amazons3 检查连接是否_钢筋机械连接接头如何检查是否合格?抽检数量、合格率是多少?...

一、钢筋机械连接介绍1、钢筋机械连接在连接区段内接头率的规定(35d):★接头宜设置在结构构件中受拉应力较小的部位,当需要在高应力部位设置时,在同一连接区段内Ⅲ接头的接头率不应大于25%,Ⅱ接头率不应大于50%,Ⅰ接头…

学容器必须懂 bridge 网络 - 每天5分钟玩转 Docker 容器技术(32)

上一节我们讨论了 none 和 host 类型的容器网络,本节学习应用最广泛也是默认的 bridge 网络。 Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上。 当前 docker0 上没有任何其他网络设备…

驻定相位原理(POSP)的简单应用

在SAR雷达成像中,POSP是相当基础重要的一个定理,一般在对回波做傅里叶变换时经常用到,一般在论文的开头就会出现。   下面简单复习一下POSP的步骤: 1:列出傅里叶变换表达式 2:对相位在驻定相位点处泰勒展…

(转)Unity3DUnity3D在android下调试

转自:http://blog.csdn.net/zuoyamin/article/details/11827309 一、工具准备 1.JDK——由于android是基于Java平台开发的,jdk是必须要安装的。下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32…

Windows系统时间同步出错解决办法

有时候我们设置本地时间与Internet时间同步时,经常连接服务器time.windows.com超时,导致时间同步失败,解决办法如下: 利用快捷键"WinR"调出运行框,输入:w32tm /register按回车,执行完…

vs2019 更新安装错误_本月Windows 10累积更新再出BUG:安装时跳出错误代码

在本月的补丁星期二活动日中,微软为所有支持的 Windows 10 系统带来了新一轮的累积更新。和以往一样,本次发布的 KB4566782 和 KB4565351 两个累积更新又出现了新的 BUG。根据用户反馈,Windows10 Version 2004/1909/1903 功能更新安装这些累积…

【python】画一个爱心

python画爱心 做二级python题目的时候,遇到了一个画爱心编程题,感觉挺有趣的,把它搬到这里来。 from turtle import * def curvemove():for i in range(200):right(1)forward(1) setup(600,600,400,400) hideturtle() pencolor(black) fill…

上天入海又怎样?阿里的运动达人纷纷表示不服

6月23日是国际奥林匹克日。奥林匹克精神其实是一个普遍的概念。所有能使人变得更好的原则,都包容它明亮的光环里。2017年1月19日,阿里巴巴和国际奥委会在洛桑共同宣布top合作伙伴计划,开启了为期12年的阿里奥运之旅。阿里将给世界带来“云上的…

VC++中内存对齐

我们经常看到求 sizeof(A) 的值的问题,其中A是一个结构体,类,或者联合体。 为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则。但是,不同的编译器可能有不同的实现,本文…

iOS:转载:IOS谓词--NSPredicate

IOS谓词--NSPredicate 分类: IOS应用2013-02-19 17:24 6792人阅读 评论(1) 收藏 举报Cocoa 提供了NSPredicate 用于指定过滤条件,谓词是指在计算机中表示计算真假值的函数,它使用起来有点儿像SQL 的查询条件,主要用于从集合中分拣…

cordova 更改app版本_Cordova打包Android应用流程(MAC)

扩展阅读基于Cordova批量打场景包(MAC)APP包名称命名规则1. 安装cordova打包应用brew install cordova2. 创建cordova项目执行命令 create app com.githen.app 测试app * app 项目的目录名称 ( 下面所有目录均以此目录为根目录说明 ) * com.githen.app 项目包名称 * 测试app 项…

二级Python 第三方库

♣\color{salmon}\clubsuit♣ 本文总结了二级Python中经常考察的一些第三方库的功能和分类,做到一半发现39,40知识点基本固定,突发奇想做个总结,有缺的话应该是前几套 功能用途第三方库数据可视化mayavi TVTK matplotlib vispy g…

深入理解Elasticsearch(原书第2版)》一1.2 何为Elasticsearch

本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第1章 ,第1.2节,[美]拉斐尔酷奇(Rafal Ku) 马雷克罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更…

深搜——数字划分问题

TYVJ 1271 零式求和 描述 请考虑一个由1到N(N3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“”表示加,或者“-”表示减,抑或是“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字…