澳门在线威尼斯官方 > 澳门在线威尼斯官方 > 只得说的异步编制程序,不得不说异步编制程序

原标题:只得说的异步编制程序,不得不说异步编制程序

浏览次数:179 时间:2019-09-14

1、什么是异步编程?

只得说的异步编制程序,不得不说异步编制程序

1、什么是异步编程?

    异步编制程序正是把耗费时间的操作放进贰个单身的线程中开展拍卖(该线程必要将实施进程反映到分界面上)。由于耗时操作是在另外二个线程中被推行的,所以它不会堵塞主线程。主线程开启这几个单独的线程后,仍是可以够继续实施其余操作(比如窗体绘制等)。

    异步编制程序能够增长顾客体验,防止在扩充耗费时间操作时让顾客观看程序“卡死”的面貌。

 

2、异步编制程序模型(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)

          当使用方面包车型客车艺术读取大文件的剧情时,会现出堵塞UI线程,导致在文书内容从未读取实现在此以前,客商无法对窗体举行其余操作(包罗关闭应用程序),那时窗体就能够产出不能够响应的景观。

          为了消除这些难题,微软早在.NET 1.0的时候就建议了异步编制程序模型,并为FileStream类提供了异步形式的艺术完结,即BeginRead方法。该方法会异步地施行读取操作,并回到完成了IAsyncResult接口的靶子(该目的存款和储蓄这异步操作的信息)。

          上面给出了BeginRead方法的定义,大家得以从中搜索它与一同方法Read的区分:

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

          从以上的异步方法的概念能够看出,该异步方法的日前3个参数与一块方法Read一致,后多少个参数userCallback和StateObject则是同台方法所不具有的。userCallback表示异步操作完结后须求回调的艺术,该办法必需相配AsyncCallback委托项目;stateObject则意味传递给回调方法的对象,在回调方法中,能够由此查询IAsyncResult接口的AsyncState属性来读取该对象。该异步方法之所以不会堵塞UI线程,是因为它在被调用后,会及时把调控权交还给调用线程(假使是UI线程调用了该措施,则就将调控权重回给UI线程),然后由另一个线程去推行文书读取操作。

 

    2.2 Endxxx方法--停止异步操作

          每回调用Beginxxx方法后,应用程序还需调用Endxxx方法来博取操作重返的结果。Beginxxx方法所重返的,是完结了IAsyncResult接口的目的,该目的并非相应的一同方法重返的结果。此时还须求调用Endxxx方法来截至异步操作,并向该办法传递Beginxxx所重返的靶子。Endxxx方法重返的项目与一同方法同样,如FileStream的EndRead方法会再次来到两个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 }

 

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

    即使眼下的异步编制程序能够消除实行耗费时间操作时分界面不能响应的标题,但APM也长期以来存在那有的威名赫赫的难题,如不帮忙对异步操作的打消以及不可能提供下载速度报告等。然则对于桌面应用程序来说,进程报告和撤消操作的意义是须求的,所以微软在.NET 2.0 发表时又建议了四个新的异步编制程序模型--基于事件的异步模型,即EAP(伊芙nt-based Asynchronous Pattern)。

    达成了EAP的类具有一个或多少个以Async为后缀的法门,以及相应的Completed事件,况且那么些类扶助异步方法的撤废和速度报告。在.NET类库中,独有部分类完结了EAP,共14个。在那17个类中,开荒进程中运用最多的实际BackgroundWorker类了。

    平常使用的性质为:

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

    IsBusy:提醒异步操作是不是正在运作;

    WorkReportProgress:只是BackgrounWorker能无法报告进度;

    WorkerSupportsCancellation:提醒BackgroundWoker是还是不是扶助异步撤除操作;

    平常利用的法门为:

    CancelAsync:乞求取消异步操作;

    ReportProgress:用于引发ProgressChanged事件;

    RunWorkAsync:调用后开始施行异步操作;

    日常使用到的3个事件为:

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

    ProgressChanged:调用ReportProgress时接触的事件,程序会在该事件中开展进程报告的换代;

    RunWorkerCompleted:当异步操作已做到、被吊销或引发那一个时被触发。

    这种艺术已经相当少用到了,所以那边就不详细介绍了。

 

4、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 Pattern)只使用贰个艺术就会表示异步操作的开头和姣好,而APM却要求Beginxxx和Endxxx三个章程分别表示最早和结束,EAP则要求具有以Async为后缀的不二等秘书诀和三个或八个事件。在依据任务的异步方式中,只须要二个以TaskAsync为后缀的方法,通过向该方法传入CancellationToken参数,我们就能够很好地成功异步编制程序了。并且,还足以经过IProgress<T>接口来落实速度报告的机能。总体来讲,使用TAP会减少大家的工作量,是代码越发从简。

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

 

5、让异步编制程序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控件的标题,进而大大减少了异步编制程序的出错率。

1、什么是异步编制程序? 异步编制程序就是把耗费时间的操作放进一个独门的线程中打开处理(该线程需求将...

    异步编制程序就是把耗费时间的操作放进二个单独的线程中进行拍卖(该线程须要将实施进程反映到分界面上)。由于耗费时间操作是在另外三个线程中被实行的,所以它不会杜绝主线程。主线程开启这一个单独的线程后,还足以继续试行别的操作(举例窗体绘制等)。

    异步编制程序能够抓实顾客体验,幸免在进展耗费时间操作时让客商观看程序“卡死”的情景。

 

2、异步编制程序模型(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)

          当使用方面包车型地铁方法读取大文件的剧情时,会出现堵塞UI线程,导致在文书内容未有读取完结在此以前,客商不可能对窗体进行别的操作(包蕴关闭应用程序),那时窗体就能够并发不恐怕响应的动静。

          为了化解这一个难题,微软早在.NET 1.0的时候就提议了异步编制程序模型,并为FileStream类提供了异步情势的办法落成,即BeginRead方法。该方法会异步地奉行读取操作,并回到落成了IAsyncResult接口的靶子(该指标存储那异步操作的新闻)。

          上边给出了BeginRead方法的定义,大家得以从中寻觅它与一齐方法Read的界别:

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

          从以上的异步方法的概念能够看出,该异步方法的前头3个参数与一块方法Read一致,后四个参数userCallback和StateObject则是一齐方法所不抱有的。userCallback表示异步操作实现后需求回调的办法,该办法必需相称AsyncCallback委托项目;stateObject则意味传递给回调方法的对象,在回调方法中,能够因而查询IAsyncResult接口的AsyncState属性来读取该指标。该异步方法之所以不会堵塞UI线程,是因为它在被调用后,会及时把调整权交还给调用线程(假诺是UI线程调用了该措施,则就将调节权重临给UI线程),然后由另叁个线程去实行文书读取操作。

 

    2.2 Endxxx方法--停止异步操作

          每一回调用Beginxxx方法后,应用程序还需调用Endxxx方法来博取操作再次回到的结果。Beginxxx方法所再次回到的,是达成了IAsyncResult接口的靶子,该目的实际不是相应的联手方法再次回到的结果。此时还索要调用Endxxx方法来终结异步操作,并向该办法传递Beginxxx所重临的对象。Endxxx方法重返的花色与一起方法一致,如FileStream的EndRead方法会重临贰个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 }

 

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

    即使日前的异步编制程序能够减轻试行耗时操作时界面不大概响应的主题材料,但APM也完全一样存在这一部分举世瞩目标标题,如不补助对异步操作的吊销以及不可能提供下载速度报告等。但是对于桌面应用程序来说,进程报告和注销操作的作用是至关重大的,所以微软在.NET 2.0 发布时又建议了多个新的异步编制程序模型--基于事件的异步模型,即EAP(伊芙nt-based Asynchronous Pattern)。

    完毕了EAP的类具备一个或三个以Async为后缀的方法,以及对应的Completed事件,并且那一个类援救异步方法的撤消和进度报告。在.NET类库中,唯有部分类完毕了EAP,共14个。在那14个类中,开荒进度中行使最多的实在BackgroundWorker类了。

    平常应用的习性为:

本文由澳门在线威尼斯官方发布于澳门在线威尼斯官方,转载请注明出处:只得说的异步编制程序,不得不说异步编制程序

关键词:

上一篇:C# Task用法

下一篇:嵌入文书档案的操作,增加和删除改文书档案上