C 非同步程式設計

2021-10-02 08:28:55 字數 2387 閱讀 1855

定義要求:

方法簽名包含 async 修飾符。

按照約定,非同步方法的名稱以「async」字尾結尾。

返回型別為下列型別之一:

1.如果你的方法有運算元為 tresult 型別的返回語句,則為 task。

2.如果你的方法沒有返回語句或具有沒有運算元的返回語句,則為 task。

3.void:如果要編寫非同步事件處理程式。

方法通常包含至少乙個 await 表示式,該表示式標記乙個點,在該點上,直到等待的非同步操作完成方法才能繼續。 同時,將方法掛起,並且控制項返回到方法的呼叫方

**示例:

static async task main(string args)

.\r\n");

}private static async taskaccessthewebasync()

private static void doindependentwork()

執行機制:關係圖中的數字對應於以下步驟,在使用者單擊「開始」按鈕時啟動。

事件處理程式呼叫並等待 accessthewebasync 非同步方法。

由於尚未等待 getstringtask,因此,accessthewebasync 可以繼續執行不依賴於 getstringasync 得出的最終結果的其他工作。 該任務由對同步方法 doindependentwork 的呼叫表示。

doindependentwork 是完成其工作並返回其呼叫方的同步方法。

getstringasync 完成並生成乙個字串結果。 字串結果不是通過按你預期的方式呼叫 getstringasync 所返回的。 (記住,該方法已返回步驟 3 中的乙個任務)。相反,字串結果儲存在表示 getstringtask 方法完成的任務中。 await 運算子從 getstringtask 中檢索結果。 賦值語句將檢索到的結果賦給 urlcontents。

當 accessthewebasync 具有字串結果時,該方法可以計算字串長度。 然後,accessthewebasync 工作也將完成,並且等待事件處理程式可繼續使用。 在此主題結尾處的完整示例中,可確認事件處理程式檢索並列印長度結果的值。 如果你不熟悉非同步程式設計,請花 1 分鐘時間考慮同步行為和非同步行為之間的差異。 當其工作完成時(第 5 步)會返回乙個同步方法,但當其工作掛起時(第 3 步和第 6 步),非同步方法會返回乙個任務值。 在非同步方法最終完成其工作時,任務會標記為已完成,而結果(如果有)將儲存在任務中。

執行結果:

在遇到awiat關鍵字之前,程式是按照**順序自上而下以同步方式執行的。

在遇到await關鍵字之後,系統做了以下工作:

非同步方法將被掛起

將控制權返回給呼叫者

使用執行緒池中的執行緒(而非額外建立新的執行緒)來計算await表示式的結果,所以await不會造成程式的阻塞

完成對await表示式的計算之後,若await表示式後面還有**則由執行await表示式的執行緒(不是呼叫方所在的執行緒)繼續執行這些**

有心的朋友應該會發現這個程式使用同步執行與使用非同步執行的結果是一樣的。(這裡我就不給出其同步執行的**),這是為什麼的呢,不急,我們來看下面的**示例:

static async task main()

static async task tempasync()

static void temp()

static async task runasync()

結果如下:

1,1,2。這個結果符合預期期望,也是同步執行應該呈現的結果。下面我們在程式上改一點東西:

static async task tempasync()

在task.delay()方法前新增乙個await關鍵字,更改後的結果如下:

我們驚奇的發現最後面的temp方法竟然最先執行了,這便是await關鍵字的神奇特效。

由於delay()方法有著阻塞執行緒的作用,所以在遇到await關鍵字之前,**都是按照正常同步順序執行。而在新增了await關鍵字之後,執行緒池會重新多建立乙個執行緒來執行下乙個**方法,而將此含有阻塞**的方法暫時掛起,所以才會有2,1,1的結果。

C 非同步程式設計

同步方法和非同步方法的區別 同步方法呼叫在程式繼續執行之前需要等待同步方法執行完畢返回結果 非同步方法則在被呼叫之後立即返回以便程式在被呼叫方法完成其任務的同時執行其它操作 非同步程式設計概覽 net framework 允許您非同步呼叫任何方法。定義與您需要呼叫的方法具有相同簽名的委託 公共語言執...

C 非同步程式設計

一 基礎知識 1 非同步程式設計 2 非同步方法 乙個程式呼叫某個方法,在處理完成前就返回該方法。同步和非同步主要用於修飾方法。當乙個方法被呼叫時,呼叫者需要等待該方法執行完畢並返回才能繼續執行,我們稱這個方法是同步方法 當乙個方法被呼叫時立即返回,並獲取乙個執行緒執行該方法內部的業務,呼叫者不用等...

c 非同步程式設計

c 中的async和await關鍵字是非同步程式設計的核心。通過使用這兩個關鍵字,你可以使用 net framework 或者執行時的資源來創造非同步方法 幾乎和你寫同步方法一樣。你通過使用async和await定義的方法就相當於非同步方法。在方法簽名中需要注意的三個地方 方法必須有async修飾....