異步編程瞭解

異步編程模式

.NET Framework提供了異步操做的三種模式:編程

  • 異步編程模型(Asynchronous Programming Model,APM)模式(也稱IAsyncResult模式),在此模式中異步操做須要Begin與End方。對於新的開發工做不推薦這用模式。
  • 基於事件的異步模式(Event-based Asynchronous Pattern,EAP),這種模式須要Async後綴,也須要一個或多個事件、事件處理程序委託類型和EventArg派生類型 。EAP在.NET Framework2.0中引入的,對於新的開發不在建議使用此模式。
  • 基於任務的異步模式(Task-based Asynchronous Pattern,TAP)使用一個方法來表示異步操做的啓動和完成。TAP是在.NET Framework4中引入的,而且它是.NET Framework中進行異步編程推薦使用的方法。C#中使用async與await關鍵字爲TAP添加了語言的支持。數據結構

    基於事件的異步模式(TAP)

    TAP是基於命名空間中的System.Threading.Tasks.Tassk命名空間中的System.Threading.Tasks.TaskSystem.Threading.Tasks.Task<TRresult>類型,這些類型用於表示任意的異步操做。異步

  1. TAP 中的異步方法在操做名稱後包含 Async 後綴;例如,get 操做的 GetAsync。 若是你正在將 TAP 方法添加到已包含具備 Async 後綴的方法名稱的類中,請改用後綴 TaskAsync。 例如,若是類具備 GetAsync 方法,請使用名稱 GetTaskAsync。async

  2. TAP 方法返回System.Threading.Tasks.TaskSystem.Threading.Tasks.Task<TResult>,取決於相應的同步方法是返回 void 仍是類型 TResult。異步編程

  3. TAP方法的參數不能是out與ref的。應將經過out或ref參數返回的全部數據改成做爲Task 返回的TRsult的一部分返回,且應使用元組或自定義數據結構來容納多個值。 code

在某些狀況下,完成操做所須要的工做量要比異步啓動操做所需的工做量少。讀取流時,按照在內存中已緩衝好的數據來知足讀取,這類情形下操做可能會同步完成,同時返回已完成的任務。對象

  1. TAP中,取消是異步方法實現者和異步方法使用者的選項。若是操做容許取消,則會公開接受取消標記(CancellationToken 實例)的異步方法的重載。 按照約定,該參數命名爲 cancellationToken。該異步操做監視取消請求的此標記。若是它收到取消請求,則能夠選擇接受該請求並取消操做。若是取消請求到時過早的結束工做,則TAP方法返回一個Canceled狀態下結束的任務,沒有可用結果且不引起異常。Canceled狀態被視爲任務最終(完成)狀態。所以,若是一個任務處於 Canceled 狀態,則其 IsCompleted 屬性將返回 true。事件

  2. 某些異步操做可能須要進度通知。與取消一下,僅在API支持進度同時,TAP實現才應提供IProcess 參數。若是TAP實現提供接受 process參數的重載,則必須容許該參數爲null,在這種狀況下,不會報告任何進度。 內存

實現基於任務的異步模式

  • 生成TAP方法
  1. 使用編譯器 在.NET Framework4.5中,任何具備async關鍵字的放安撫都被看作是一種異步方法,而且C#編譯器會執行必要的轉換,以經過TAP來異步實現該方法
  2. 手動生成TAP方法
  3. 混合方法

在計算密集型任務中,若是系統在開始運行任務以前收到取消請求,則它能夠防止執行已計劃的任務。一樣,若是你提供一個取消標記(CancellationToken對象),則能夠將標記傳遞給監視該標記的異步代碼開發

使用基於任務的異步模式

當在等待Task時,await表達式的類型爲void,等待Task 時,await表達式爲TResult,await表達式必須出如今異步方法的主體內。等待功能經過持續性在任務上安裝回調,此回調將在掛起點繼續異步方法,恢復異步方法 在恢復異步方法時,若是等待操做已成功完成而且爲 Task ,則將返回其 TResult。若是所等待的 Task 或 Task 以 Canceled 關閉狀態結束,則將引起 OperationCanceledException 異常。若是所等待的 Task 或 Task 以 Faulted 狀態關閉,則將引起致使其出錯的異常。 因爲多個異常,Task 可能錯誤,可是隻傳播這些異常中的一個。 可是,Task.Exception 屬性返回包含全部錯誤的 AggregateException 異常。

相關文章
相關標籤/搜索