全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#老生常谈之异步调用的参数及返回值 2010-05-29 20:30代码段1: public delegate string FuncHandle(int data1, int data2); FuncHandle fh ; private void BT_Temp_Click(object sender, RoutedEventArgs e) fh = new FuncHandle(this.Foo); AsyncCallback callback = new AsyncCallback(this.AsyncCallbackImpl); fh.BeginInvoke(1, 3, callback, null); public void AsyncCallbackImpl(IAsyncResult ar) string re = fh.EndInvoke(ar); MessageBox.Show( + ar.AsyncState); string Foo(int data1, int data2) return + data1 + data2; 在异步调用中,如果想在异步的回调函数中,得到异步函数的返回值(如上面代码中的Foo函数的string返回值),则必须要在回调函数中使用EndInvoke(关于EndInvoke会在下文描述)。在上面的例子是如下这句。 string re = fh.EndInvoke(ar);但是,有的时候fh并不见得是个类变量,这个时候,就需要我们将EndInvoke的执行主体由BeginInvoke传递进去。看修改过后的代码片段。代码段2: public delegate string FuncHandle(int data1, int data2); private void BT_Temp_Click(object sender, RoutedEventArgs e) FuncHandle fh = new FuncHandle(this.Foo); AsyncCallback callback = new AsyncCallback(this.AsyncCallbackImpl); fh.BeginInvoke(1, 3, callback, fh); public void AsyncCallbackImpl(IAsyncResult ar) FuncHandle dl = ar.AsyncState as FuncHandle; string re = dl.EndInvoke(ar); MessageBox.Show( + ar.AsyncState); string Foo(int data1, int data2) return + data1 + data2; 通过举一反三,其实BeginInvoke的最后一个参数,可以是任何对象,看具体的应用场景即可。下面再介绍一下EndInvoke。EndInvoke在回调函数中,用于承载执行的主体函数的返回值。在另外一个情况下,即上面的代码片段一个简化版本,如下:代码段3: public delegate string FuncHandle(int data1, int data2); private void BT_Temp_Click(object sender, RoutedEventArgs e) FuncHandle fh = new FuncHandle(this.Foo); IAsyncResult ar = fh.BeginInvoke(1, 3, null, fh); string re = fh.EndInvoke(ar); MessageBox.Show(re); string Foo(int data1, int data2) return + data1 + data2; 我们可以看到,在这个代码片段中,我们根本没有使用回调函数,那么,我们就需要通过EndInvoke来阻滞主线程,使得返回函数主体的返回值。再多说一点,调用了 BeginInvoke 后,可以:1.进行某些操作,然后调用 EndInvoke 一直阻塞到调用完成。如上文的最后一个代码片段。2.使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用EndInvoke。这里主要是主程序等待异步方法,等待异步方法的结果。见代码段4。3.轮询由 BeginInvoke 返回的 IAsyncResult,IAsyncResult.IsCompeted确定异步调用何时完成,然后调用 EndInvoke。4.将用于回调方法的委托传递给 BeginInvoke。该方法在异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。这是在强制装换回调函数里面IAsyncResult.AsyncState(BeginInvoke方法的最后一个参数)成委托, 然后用委托执行EndInvoke。即如上代码片段2。代码段4: public delegate string FuncHandle(int data1, int data2); string _sTemp = string.Empty; private void BT_Temp_Click(object sender, RoutedEventArgs e) FuncHandle fh = new FuncHandle(this.Foo); AsyncCallback callback = new AsyncCallback(this.AsyncCallbackImpl); IAsyncResult ar = fh.BeginInvoke(1, 3, null, null); WaitHandle waitHandle = ar.AsyncWaitHandle; waitHandle.WaitOne();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025泉州银行宁德分行招聘备考题库含答案详解(综合题)
- 2026绍兴银行校园招聘65人备考题库含答案详解(培优a卷)
- 2025巴彦淖尔五原县招聘50名社区工作者备考题库含答案详解(精练)
- 2025年乐平市公开招聘城市社区工作者(专职网格员)的备考题库【30人】及答案详解1套
- 2026杭州银行金华分行秋季校园招聘备考题库及答案详解(有一套)
- 2025重庆潼南区就业和人才中心公益岗招聘1人备考题库附答案详解(a卷)
- 2026中国建设银行上海大数据智慧中心校园招聘4人备考题库及完整答案详解一套
- 2025广东韶关始兴县罗坝镇招聘桃源村党群服务中心专职人员1人备考题库含答案详解(能力提升)
- 2026中国邮政储蓄银行厦门分行校园招聘备考题库含答案详解(培优a卷)
- 2025年下半年长春市总工会公开招聘工会社会工作者备考题库(61人)附答案详解(轻巧夺冠)
- 电焊机操作技能培训
- 淋巴水肿康复护理手册
- 杂交水稻之父袁隆平
- 国家开发银行介绍
- 教资考试论述题含答案
- 阿尔茨海默症医疗护理查房
- 2025年辽宁轻工职业学院单招职业技能考试题库及答案详解网校专用
- 2025人教版八年级英语上册《Unit5》教学设计
- 杨根思事迹介绍
- 第11课 可亲可敬的家乡人 课件 2025-2026学年道德与法治二年级上册统编版
- 国家网络安全防御体系建设行动方案
评论
0/150
提交评论