C#异步调用的好处和方法分享__第1页
C#异步调用的好处和方法分享__第2页
C#异步调用的好处和方法分享__第3页
C#异步调用的好处和方法分享__第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#异步调用的好处和方法分享_ 程包括界面就不会死掉了。异步如何开头,好理解,现在我们商量的是如何结束这个异步出来的新线程。 首先,异步出来的新线程,必需回收,不回收是铺张资源的可耻行为,.NET也是不允许的,所以你别想钻空子,俗话说,请神简单送神难,就是这个道理。下面你可以很简单想到,回收分为2种状况:主动回收和被动回收(当然,这是我自己的理解,微软可不是这么说的),主动回收就是,你去监视那个线程,并且等待,当异步方法完成了,就把异步线程回收,焦点回来主线程,事实上就是上篇文章C#异步初步的那种状况,BeginInvoke之后又EndInvoke,假如在EndInvoke的时候,该异步线程没

2、有完成操作,那么整个程序,包括主线程,又在堵塞了,又会消失界面“死”的状况。要想解决这个问题,就用法“被动回收”方式,其中一个重要的方法就是“异步回调”。 核心有二: A、 用回调函数(本例中为CallBackMethod),异步结束后,自动调用此回调函数。 B、 而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke。此种方法,是在回调函数中调用EndInvoke的。 异步回调的也许流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最终当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样的确很省心,可是代码写起来,就很

3、简单了。 下面是搜藏的代码: 复制代码代码如下: /首先预备好,要进行异步的方法(能异步的,最好不多线程) privatestringMethodName(intNum,outintNum2) Num2=Num; returnHelloWorld; /程序终点 /异步完成时,执行的方法(回调方法),此方法只能有IAsyncResult一个参数,但是该参数几乎万能,可以传递object privatevoidCallBackMethod(IAsyncResultar) /从异步状态ar.AsyncState中,猎取托付对象 DelegateNamedn=(DelegateName)ar.Asyn

4、cState; /输出参数 inti; /肯定要EndInvoke,否则你的下场很惨 stringr=dn.EndInvoke(outi,ar); MessageBox.Show(异步完成喽!i的值是i.ToString(),r的值是r); /定义与方法同签名的托付 privatedelegatestringDelegateName(intNum,outintNum2); /程序入口 privatevoidRun() /实例化托付并初赋值 DelegateNamedn=newDelegateName(MethodName); /输出参数 inti; /实例化回调方法 /把AsyncCallba

5、ck看成Delegate你就懂了,事实上AsyncCallback是一种特别的Delegate,就像Event似的 AsyncCallbackacb=newAsyncCallback(CallBackMethod); /异步开头 /假如参数acb换成null则表示没有回调方法 /最终一个参数dn的地方,可以换成任意对象,该对象可以被回调方法从参数中猎取出来,写成null也可以。参数dn相当于该线程的ID,假如有多个异步线程,可以都是null,但是肯定不能一样,不能是同一个object,否则特别 IAsyncResultiar=dn.BeginInvoke(1,outi,acb,dn); /去做

6、别的事 / /最终的结果应当是:i=1,r=HelloWorld /另外,假如可以,定义托付的时候可以选择不用过多的修饰: /summary /定义托付 /summary /returns/returns publicdelegateboolAsyncdelegate(); /summary /Callbackmethodmusthavethesamesignatureasthe /AsyncCallbackdelegate /summary /paramname=ar/param privatevoidCallbackMethod(IAsyncResultar) /Retrievethedelegate. Asyncdelegatedlgt=(Asyncdelegate)ar.AsyncState; /CallEndInvoketoretrievetheresults. dlgt.EndInvoke(ar); /其他方法中调用: /异步执行 /指定托付方法 Asyncdelegateisgt=newAsyncdelegate(i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论