.Net 異步調用

.NET異步編程之新利器——Task與Await、Async

 

一.  FrameWork 4.0以前的線程世界    html

    在.NET FrameWork 4.0以前,若是咱們使用線程。通常有如下幾種方式:web

  • 使用System.Threading.Thread 類,調用實例方法Start()開啓一個新線程,調用Abort()方法來提早終止線程。
  • 使用System.Threading.ThreadPool類,調用靜態方法QueueUserWorkItem(),將方法放入線程池隊列,線程池來控制調用。
  • 使用BeginInvoke,EndInvoke,BeginRead,EnRead,BeginWrite,EndWrite等一系列的異步方法。
  • 使用System.ComponentModel.BackgroundWorker控件,調用實例方法RunWorkerAsync(),開啓一個新線程。 

二.  .Net 傳統異步編程概述 編程

  • 異步編程模型 (APM),在該模型中異步操做由一對 Begin/End 方法(如 FileStream.BeginRead 和 Stream.EndRead)表示。
  • 基於事件的異步模式 (EAP),在該模式中異步操做由名爲「操做名稱Async」和「操做名稱Completed」的方法/事件對(例如 WebClient.DownloadStringAsync 和 WebClient.DownloadStringCompleted)表示。 (EAP 是在 .NET Framework 2.0 版中引入的,在silverlight或者wpf變成中常常用到)。

三.  Task 的優勢以及功能   異步

  • 在任務啓動後,能夠隨時以任務延續的形式註冊回調。
  • 經過使用 ContinueWhenAll 和 ContinueWhenAny 方法或者 WaitAll 方法或 WaitAny 方法,協調多個爲了響應 Begin_ 方法而執行的操做。
  • 在同一 Task 對象中封裝異步 I/O 綁定和計算綁定操做。
  • 監視 Task 對象的狀態。
  • 使用 TaskCompletionSource 將操做的狀態封送到 Task 對象。

四.  TASK的用法async

     請參考這篇文章異步編程

五.  使用 Task 封裝常見的異步編程模式函數

  • 使用Task封裝APM異步編程模式。C#5.0中提供的async和await使異步編程更簡單。await在msdn的解釋是「運算符應用於一個異步方法的任務掛起方法的執行,直到等待任務完成。 任務表示正在進行的工做。」它返回的結果是Task和Task<TResult>.下面咱們就用一個demo具體解析:

    

複製代碼
private async void Init()
{
      //部分代碼省略
    var orgs = await _serviceClient.GetAllOrganizationTaskAsync();    
}


//經過WCF調用,採起分佈類,名稱同樣。
public partial class ServiceClient
{
 public Task<ObservableCollection<Organization>>   GetAllOrganizationTaskAsync()
         {
            //Task 封裝APM
             return Task<ObservableCollection<Organization>>.Factory.FromAsync(this.Channel.BeginGetAllOrganization,                                                      this.Channel.EndGetAllOrganization, null);
         }
}
複製代碼
  • 使用 Task 對象封裝 EPM 異步模式 。 這種模式從 .Net 2.0 開始出現, 同時在 Silverlight 中大量出現, 這種異步模式以 「操做名稱Async」 函數和 「操做名稱Completed」 事件成對出現爲特徵。常見的操做有使用lamda表達式;或者使用+=「操做名稱Completed」(tip:若是使用lamda表達式,沒法回收資源,若是同時調用多個,數據會亂套,建議若是非要用,最好用+=「操做名稱Completed」,在操做名稱Completed事件中再-=「操做名稱Completed」)。
    關鍵字:TaskCompletionSource,簡單理解委託給task屬性,利用task來操做。

 

複製代碼
var source = new TaskCompletionSource<string>();

var webClient = new WebClient();

webClient.DownloadStringCompleted += (sender, args) => {

   if (args.Cancelled) {

      source.SetCanceled();

      return;

   }

   if (args.Error != null) {

      source.SetException(args.Error);

      return;

   }

   source.SetResult(args.Result);

};

webClient.DownloadStringAsync(new Uri(UrlToTest, UriKind.Absolute), null);

source.Task.Wait();

var result = source.Task.Result;
複製代碼

 

此博客來自於http://www.cnblogs.com/luqixinhe/archive/2013/07/18/3197645.html,記錄時爲了更好的學習。post

相關文章
相關標籤/搜索