1. 程式人生 > >使用 async/ await 進行 異步 編程

使用 async/ await 進行 異步 編程

返回值 ID 事件 情況下 異步操作 編譯 有意 構建 await

一、異步函數

異步函數概念。 通常 是 指用 async 修飾 符 聲明 的, 可 包含 await 表達式 的 方法 或 匿名 函數 1。 從 語言 的 視角 來看, 這些 await 表達式 正是 有意思 的 地方: 如果 表達式 等待 的 值 還不 可用, 那麽 異步 函數 將 立即 返回; 當 該 值 可用 時, 異步 函數 將( 在 適當 的 線程 上) 回到 離開 的 地方 繼續 執行。 此前“ 在這 條 語句 完成 之前 不要 執行 下一 條 語句” 的 流程 依然 不變, 只是 不再 阻塞。

二、異步執行的基礎

異步執行模型,充斥著後續操作。即某個操作完成後會進行另外的後續操作。回調函數類似。在net 中後續操作理所應當由委托表示,且通常為接收異步操作結果的action。實際上,C#編譯器會對所有的await都構建一個後續操作;

在C#5中,異步的操作流程大致分為以下流程:

1、執行 某些 操作。

2、開始 異步 操作, 並 記住 返回 的 token。

3、可能 會 執行 其他 操作。( 在 異步 操作 完成 前, 往往 不能 進行 任何 操作, 此時 忽略 該 步驟。)

4、等待 異步 操作 完成( 通過 token)。

5、執行 其他 操作。

6、完成。

兩個: async 是在 聲明 異步 方法 時 使用 的 修飾 符, await 表達式 則 負責 消費 異步 操作。

三 、詳細內容講解

1.聲明異步方法:方法最好包含async關鍵字,async可以出現在返回類型之前的任何位置;

2、異步方法的返回類型:調用者和異步方法之間是通過返回值來通信的,異步方法的的返回類型只能為:

void、Task、Task<Result>....

.NET 4 中的 Task 和 Task< TResult> 類型 都 表示 一個 可能 還未 完成 的 操作。 Task< TResult> 繼承 自 Task。 二者 的 區別 是, Task< TResult> 表示 一個 返回 值 為 T 類型 的 操作, 而 Task 則 不需要 產生 返回 值。

之所以 將 異步 方法 設計 為 可以 返回 void, 是 為了 和 事件 處理 程序 兼容。

對於一個異步方法,只有在作為事件訂閱者時才能返回void。在其他需要忒定返回值的情況下,最好將方法聲明為Task。

3.可等待模式

使用 async/ await 進行 異步 編程