


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 研究路程回顾
- 玉米须茶泡果干行业深度调研及发展战略咨询报告
- 智能文档管理器行业深度调研及发展战略咨询报告
- 炭黑增强橡胶轮胎技术企业制定与实施新质生产力战略研究报告
- 物流无人机载重与平衡行业跨境出海战略研究报告
- 《信息技术》课件-第六章专题四可以复用的代码
- 基于生物降解材料的医疗废物资源化利用研究-洞察阐释
- 农业环保法规执行效应-洞察阐释
- 拍卖支付行为的用户行为特征分析-洞察阐释
- 元宇宙背景下的青年反抗与亚文化生成-洞察阐释
- 小学数学培训微讲座
- 《电子产品简介》课件
- 疑似新冠肺炎的应急演练
- 赛迪顾问一线调研第36期:中国人工智能医疗器械:前路漫漫仍需披荆斩棘
- 2024秋期国家开放大学《可编程控制器应用实训》一平台在线形考(形成任务5)试题及答案
- 广东省广州三校2023-2024学年高二下学期期末考试+政治试卷(含答案)
- 健康照护师技能大赛刷题(四)附有答案
- 聚乳酸纤维的可持续生产和应用
- 9+2×0.75m装配式钢筋混凝土简支T型梁桥设计计算论文
- 网课智慧树知道《计算机科学导论(聊城大学)》章节测试答案
- 无人机打药协议书
评论
0/150
提交评论