只得说的异步编制程序

一 、什么是异步编制程序?

   
异步编程正是把耗费时间的操作放进3个独门的线程中开始展览拍卖(该线程须要将实行进度反映到界面上)。由于耗费时间操作是在其它贰个线程中被执行的,所以它不会堵塞主线程。主线程开启那么些单独的线程后,仍可以继续执行其余操作(例如窗体绘制等)。

   
异步编制程序能够增强用户体验,防止在进展耗费时间操作时让用户阅览程序“卡死”的情景。

 

贰 、异步编制程序模型(APM)

    APM是Asynchronous Programming
Mode的缩写,即异步编制程序模型的情致,它同意程序用更少的线程去执行越多的操作。在.NET
Framework中,要甄别有个别类是或不是完结了异步编制程序模型,重要正是看该类是不是贯彻了归来类型为IAsyncResult接口的BeginXXX方法和EndXXX方法。

   
由于委托类型定义了BeginInvoke和EndInvoke方法,所以委托项目都落实了异步编程模型。

    2.1 Beginxxx方法–开首实施异步操作

         
在急需获得文件中的内容时,大家平日会使用FileStream的联手方法Read举办读取,该联合方法的定义为:

          public override int Read(byte[] array,int offset,int count)

ca88官网,         
当使用方面包车型客车主意读取大文件的始末时,会合世堵塞UI线程,导致在文件内容尚未读取完毕从前,用户不可能对窗体实行其它操作(包含关闭应用程序),那时窗体就会冒出不也许响应的场地。

          为了消除那些标题,微软早在.NET
1.0的时候就提出了异步编制程序模型,并为FileStream类提供了异步方式的措施达成,即BeginRead方法。该方法会异步地推行读取操作,并赶回实现了IAsyncResult接口的靶子(该对象存款和储蓄那异步操作的音信)。

         
上面给出了BeginRead方法的定义,咱们能够从中找出它与一起方法Read的界别:

          public override IAsyncResult BeginRead(byte[] array,int
offset,int numBytes,AsyncCallback userCallback,Object stateObject)

         
从上述的异步方法的定义能够看到,该异步方法的先头一个参数与共同方法Read一致,后五个参数userCallback和StateObject则是贰头方法所不享有的。userCallback表示异步操作完毕后供给回调的情势,该方式必须匹配AsyncCallback委托项目;stateObject则代表传递给回调方法的对象,在回调方法中,能够透过查询IAsyncResult接口的AsyncState属性来读取该对象。该异步方法之所以不会堵塞UI线程,是因为它在被调用后,会马上把控制权交还给调用线程(假使是UI线程调用了该办法,则就将控制权重回给UI线程),然后由另一个线程去实施文书读取操作。

 

    2.2 Endxxx方法–甘休异步操作

         
每趟调用Beginxxx方法后,应用程序还需调用Endxxx方法来获得操作再次来到的结果。Beginxxx方法所重回的,是落到实处了IAsyncResult接口的对象,该对象并非相应的同步方法重回的结果。此时还亟需调用Endxxx方法来收场异步操作,并向该形式传递Beginxxx所再次回到的指标。Endxxx方法重返的门类与联合方法一致,如FileStream的EndRead方法会重返1个Int32品种,代表从文件流中实际读取的字节数。

         
Endxxx方法有诸多中方法调用,但有一种是最常用的,即利用AsyncCallback委托来钦赐操作达成时要调用的方法,在回调方法中调用Endxxx方法来收获异步操作再次来到的结果。

 1 static void Main()
 2 {
 3     SynchronizationContext sc=SynchronizationContext.Current;
 4     AsyncMethodCaller methodCaller=new AsyncMethodCaller(DownLoadFileAsync);
 5     method.BeginInvoke(txtUrl.Text.Trim(),GetResult,null);
 6 }
 7 private static void GetRsult(IAsyncResult result)
 8 {
 9     AsyncMethodCaller caller=(AsyncMethodCaller)((AsyncResult)result).AsyncDelegate;
10     string returnstring=call.EndInvoke(result);
11 }

 

叁 、异步编制程序模型(EAP)

   
固然眼下的异步编程能够消除执行耗费时间操作时界面不或者响应的题目,但APM也同等存在那有个别威名赫赫的题材,如不支持对异步操作的打消以及不能够提供下载速度报告等。可是对于桌面应用程序而言,进程报告和撤废操作的功效是必不可少的,所以微软在.NET
2.0
公布时又提出了多个新的异步编程模型–基于事件的异步模型,即EAP(伊芙nt-based
Asynchronous Pattern)。

   
完结了EAP的类具有1个或多少个以Async为后缀的章程,以及相应的Completed事件,并且那些类帮助异步方法的打消和速度报告。在.NET类库中,唯有部分类达成了EAP,共1四个。在那1多少个类中,开发进度中使用最多的其实BackgroundWorker类了。

    平时使用的习性为:

    CancellationPending:用来提示应用程序是不是已呼吁撤消后台操作;

    IsBusy:提示异步操作是不是正在周转;

    WorkReportProgress:只是BackgrounWorker能或不能够报告进度;

   
WorkerSupportsCancellation:提醒BackgroundWoker是不是协理异步裁撤操作;

    平时采用的艺术为:

    CancelAsync:请求撤消异步操作;

    ReportProgress:用于引发ProgressChanged事件;

    RunWorkAsync:调用后初叶推行异步操作;

    平日利用到的3个事件为:

    DoWork:调用RunWokerAsync时接触的事件;

   
ProgressChanged:调用ReportProgress时接触的风云,程序会在该事件中开展速度报告的立异;

    RunWorkerCompleted:当异步操作已形成、被注销或吸引那多少个时被触发。

    那种措施已经很少用到了,所以那边就不详细介绍了。

 

肆 、TAP又是哪些?

    前边介绍了.NET提供的二种异步编程形式,分别为.NET 1.0中的APM和.NET
2.0中的EAP。就算那三种异步编制程序形式可以完成多数意况下的异步编制程序,可是它们在MSDN文书档案上都被标明为了不推荐使用的贯彻方式,因为在.NET
4.0中,微软又提供了更简便的异步编制程序实现方式–TAP,基于职务的异步方式。

   
该格局主要采纳System.Threading.Tasks命名空间中的Task<T>类来完毕异步编程,所以在使用TAP以前,首先要引入System.Threading.Tasks命名空间。

    基于职务的异步情势(TAP,Task-based Asynchronous
帕特tern)只行使叁个方法就能表示异步操作的开始和成功,而APM却必要Beginxxx和Endxxx三个格局分别表示开端和完工,EAP则要求具备以Async为后缀的方式和1个或多个事件。在根据职务的异步方式中,只须求1个以TaskAsync为后缀的法子,通过向该格局传入CancellationToken参数,我们就足以很好地完毕异步编程了。而且,还足以经过IProgress<T>接口来完毕速度报告的法力。总体来说,使用TAP会收缩我们的工作量,是代码特别简洁。

1 Task task=new Task(()=>{.......});
2 task.Start();

 

伍 、让异步编程So easy——C# 5.0中的async和await

    即便.NET 1.0和.NET 2.0和.NET
4.0都对异步编制程序做了很好的支撑,微软也慢慢地采取异步编制程序变得不难,但微软认为现有的做事还不够,它愿意使异步编制程序的付出进程越是简化,所以在.NET
4.5中,微软又建议了async和await七个至关心珍视要字来协理异步编制程序。

    那也是方今.NET
Framework中最简便易行的异步编制程序完毕格局,因为运用那些两个关键字展开异步编制程序,思考格局和贯彻同步编制程序时的通通等同。

   
async和await关键字不会让调用方法运转在新线程中,而是将艺术分割成多少个部分(片段的底限出以后点子内部使用await关键字的地方处),并使内部有个别有些能够异步运转。await关键字处的代码片段是在线程池线程上运转的,而全套艺术的调用确实联合的。所以,使用此方法编制程序不用考虑跨线程访问UI控件的标题,从而大大下落了异步编制程序的出错率。

相关文章