1. 为什么需要异步编程
  • 快速响应的用户界面;

         平时有过这样一个体验,执行一个程序,然后点击一个按钮,鼠标就在那儿不停的转圈,再在界面上点两下,界面变灰,标题栏上出现"没有响应"。然后我们束手无策,

       性子好点的可以等一会,看能否恢复过来;性子不好的,直接杀掉该进程,但这样有可能破坏重要数据。造成这样的情况原始是耗时的操作阻塞了UI线程,造成UI线程不能响应

       用户操作。这个时候需要一种机制,在发起耗时操作的请求之后要立即返回,不要阻塞UI线程,让UI线程可以继续响应用户的操作,然后等耗时操作返回后,通过回调来处理耗时

       操作返回的结果。

  • 更高的伸缩性;

            简单来说,响应一个程序需要一个线程来服务这个程序,如果这个程序需要调用第三方资源,那么这个线程需要去第三方处索要资源,这个时候,该线程无法处理其它事务,

         当然此时程序不响应任何用户操作,只有等线程取回第三方资源返回给程序时,程序才能进一步响应用户操作。整个过程,该线程处于等待状态,此时线程可以返回线程池,

        当第三方资源处理完毕时,由线程池重新分配线程去处理返回资源,当然同时程序可以响应用户的操作。

      

 

2.  异步编程模式

  •  
    • Classic Async Pattern

这种方式就是提供两个方法实现异步编程:比如System.IO.Stream的Read 方法:

public int Read(byte[] buffer,int offset,int count); 提供两个方法实现异步读取:

public IAsyncResult BeginRead (byte[] buffer,int offset,int count,AsyncCallback callback);

public int EndRead(IAsyncResult asyncResult);

以Begin开头的方法发起异步操作,Bengin开头的方法里还会接受一个AsyncCallback类型的回调,该方法会在异步操作完成后执行。

然后通过调用EndRead获得异步操作的结果。

 

  •  
    • Event-based Async Pattern(EAP)

                        基于事件的异步模式具有多线程应用程序的优点,同时隐藏了多线程设计中固有的许多复杂问题(后台执行耗时任务,但不会中断您的应用程序;

同时执行多个操作,每个操作完成都会接到通知;等待资源变得可用,但不会停止您的应用程序;使用熟悉的事件和委托模型与挂起的异步操作通信)

支持基于事件的异步模式的类将有一个或多个名为MethodNameAsync的方法,该类还可能有一个MethodNameCompleted事件,而且还可能有一个

MethodNameAsyncCancel方法。

posted on 2011-03-22 18:24  默斋  阅读(293)  评论(0编辑  收藏  举报