Task非同步程式設計

2022-07-22 19:36:16 字數 2265 閱讀 3139

task非同步程式設計中,可以實現在等待耗時任務的同時,執行不依賴於該耗時任務結果的其他同步任務,提高效率。

1、task非同步程式設計方法簽名及返回值:

a) 簽名有async 修飾符

b) 方法名以 async 結尾(良好的編碼習慣)

根據約定,將「async」追加到具有 async 修飾符的方法名稱。如果某一約定中的事件、基類或介面協定建議其他名稱,則可以忽略此約定。例如,你不應重新命名常用事件處理程式,例如 btnopen_click。

c) 返回型別如下:

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

舉例如下:

private static async taskoperateasync()

2、 舉例分析:

static

void main(string

args)

public

class

test1

private

static

async taskoperateasync()

private

static

void

doindependentwork()

}}

3、步驟分析:

【備註】

(1)如果 getstringasync(即 getstringtask)在 operateasync 等待前完成,則控制權會保留在 operateasync 中。 如果非同步呼叫過程 (getstringtask) 已完成,並且operateasync不必等待最終結果,則掛起然後返回到 operateasync,但這會造成成本的浪費。

(2)在呼叫方內部(doclickasync),處理模式將繼續。在等待結果前,呼叫方可以開展不依賴於operateasync結果的其他工作,否則就需等待片刻。doclickasync等待 operateasync,而 operateasync 等待 getstringasync。

4、同步行為和非同步行為差異:

5、詳談返回型別:

在.net 中,非同步方法通常返回 task 或 task。在非同步方法中,await運算子應用於通過呼叫另乙個非同步方法返回的任務。

1、如果方法包含指定型別 tresult 的運算元的return語句,則將 task指定為返回型別。

2、如果方法不含任何 return 語句或包含不返回運算元的 return 語句,則將task用作返回型別。

【備註】

每個返回的任務表示正在進行的工作。任務可封裝有關非同步程序狀態的資訊,如果未成功,則最後會封裝來自程序的最終結果或程序引發的異常。

3、非同步方法還可以是具有void返回型別。該返回型別主要用於定義需要void返回型別的事件處理程式。非同步事件處理程式通常用作非同步程式的起始點。無法等待具有void返回型別的非同步方法,並且乙個void返回值的呼叫方無法捕獲該方法引發的任何異常。

下面的示例演示如何宣告並呼叫可返回 task 或 task的方法。

static

void main(string

args)

private

static

async

void

domethodasync()

//返回task型別

static

async taskmethod1async()  //

task

//返回task型別

static

async task method2async()  //

task

6、總結:

1、標記的非同步方法(通過使用 async 修飾符)可以使用 await 來指定懸掛點。await 運算子通知編譯器,非同步方法只有直到等待的非同步過程完成才能繼續通過該點。同時,控制權將返回至非同步方法的呼叫方。

2、非同步方法通常包含 await 運算子的乙個或多個匹配項,但缺少 await 表示式不會導致編譯器錯誤。如果非同步方法未使用 await 運算子標記懸掛點,則該方法將作為同步方法執行,不管非同步修飾符(async)如何。編譯器將為此類方法發布乙個警告。

7、參考:

Task非同步程式設計,刨根到底

await 乙個非同步操作的時候,實際上編譯器會建立乙個狀態機,這個狀態機包含了呼叫者的上下文變數,狀態機使用yield迭代器實現,狀態機由clr排程,每次執行都會重新加入回佇列,直到task完成或異常結束 經常我們可以看到一些庫中使用taskcompletionsource來建立task,改變ta...

c 非同步程式設計 Task(一)

thread執行緒是用來建立併發的一種低級別工具,它具有一些限制,尤其是 task類可以很好的解決上述問題,它是乙個高階抽象 它代表了乙個併發操作 concurrent 該操作可能有thread支援,或不由thread支援。開始乙個task最簡單的辦法就是使用task.run net4.5,4.0的...

多執行緒非同步程式設計示例和實踐 Task

上篇博文中,我們介紹了thread和threadpool 多執行緒非同步程式設計示例和實踐 thread和threadpool 本文中我們繼續,說一下tpl task parallel library,簡稱tpl 在實際的開發中,使用執行緒池相當複雜,執行緒的異常捕獲 傳遞以及編排這些問題實現起來都...