你的位置:首页 > 软件开发 > ASP.net > 不得不说的异步编程

不得不说的异步编程

发布时间:2016-09-04 15:00:09
1、什么是异步编程? 异步编程就是把耗时的操作放进一个单独的线程中进行处理(该线程需要将执行进度反映到界面上)。由于耗时操作是在另外一个线程中被执行的,所以它不会堵塞主线程。主线程开启这些单独的线程后,还可以继续执行其他操作(例如窗体绘制等)。 异步编 ...

1、什么是异步编程?

    异步编程就是把耗时的操作放进一个单独的get='_blank'>线程中进行处理(该线程需要将执行进度反映到界面上)。由于耗时操作是在另外一个线程中被执行的,所以它不会堵塞主线程。主线程开启这些单独的线程后,还可以继续执行其他操作(例如窗体绘制等)。

    异步编程可以提高用户体验,避免在进行耗时操作时让用户看到程序“卡死”的现象。

 

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 }

原标题:不得不说的异步编程

关键词:异步

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。