


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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年教师招聘之《幼儿教师招聘》考试题库及参考答案详解【黄金题型】
- 智能门铃视频通话创新创业项目商业计划书
- 电动汽车充电网络智能调度与分配创新创业项目商业计划书
- 仙客来创新创业项目商业计划书
- 教师招聘之《小学教师招聘》试卷附完整答案详解(夺冠系列)
- 教师招聘之《小学教师招聘》自我提分评估附答案详解(b卷)
- 教师招聘之《幼儿教师招聘》考试历年机考真题集附答案详解(能力提升)
- 教师招聘之《小学教师招聘》能力检测(典型题)附答案详解
- 教师招聘之《小学教师招聘》考试黑钻押题带答案详解(培优b卷)
- 教师招聘之《小学教师招聘》考前冲刺测试卷讲解及参考答案详解1套
- 明厨亮灶协议书
- 新药研究与开发技术 课件3.新药的工艺与质量研究
- “厂中厂”安全生产管理协议书(未修改版)7篇
- 《智能制造技术》课件 第4章 智能设计
- 类风湿关节炎健康教育
- 2025年装维智企工程师(三级)复习模拟100题及答案
- 中外建筑(教学设计)浙教版六年级上册综合实践活动
- 部编人教版6年级道德与法治上册全册教学课件
- 2025年中国人保财险全系统黑龙江分公司招聘笔试参考题库含答案解析
- 学生应急突发事件处理培训
- 施工单位对分包单位的管理制度
评论
0/150
提交评论