15 4 Task 非同步匿名函式

2022-02-21 01:29:31 字數 1438 閱讀 3729

1             func> func = async x =>2"

, x);

4await

task.delay(x);

5 console.writeline("

ending x=

", x);

6return x * 2;7

};89 task first1 = func(5

);10 task first2 = func(3

);11 console.writeline("

first1 result =

", first1.result);

12 console.writeline("

first2 result =

", first2.result);

13/*

starting x=5

14starting x=3

15ending x=3

16ending x=5

17first1 result = 10

18first2 result = 6

*/

此處我故意選擇這樣的值,以便讓第二個操作早於第乙個完成。但由於我們要在等待第乙個 操作完成後再列印結果(使用 result 屬性,這將阻塞執行緒直到任務結束。再次強調一遍,執行 這樣的**時要十分謹慎!)

將非同步**放到非同步方法中,也可得到同樣的結果。 非同步匿名函式並不會讓我感到特別興奮,但它也有自己的用途。儘管不能應用於linq查詢 表示式,但在某些情況下,還是可以實現資料轉換的非同步執行的。這時,只需以一種略微不同的 方式思考整個過程即可。 在討論完成分後,我們還會回到這個話題,但首先我想向大家展示一下非同步匿名函式特別有 用的乙個方面。我之前承諾過,要展示另一種在非同步方法開始時及早執行引數驗證的方式。你可 能還記得,在進入主操作前,需檢查引數值是否為空。**清單15-10是乙個單個方法,其結果 與**清單15-6中兩個分離方法得到的結果完全相同。

1

static task computelengthasync(string

text)

27 funcint>> func = async () => 8;

12return

func();

13 }

你會發現這並不是乙個非同步方法。如果是的話,異常會被包裝到任務裡,而不是立即丟擲。 但我們還是想返回乙個任務,因此在驗證 之後,將工作包裝到乙個非同步匿名函式中 ,呼叫委 託 並返回結果。 儘管這看上去還是有點醜,但比分割成兩個方法要清晰多了。不過效能上會蒙受一點損失: 額外的包裝會產生額外的代價。這在大多數情況下都沒有問題,但如果你編寫的庫會應用於注重 效能的程式,則應在真實場景中檢測成本,然後再決定使用哪種方法。

Task非同步程式設計

task非同步程式設計中,可以實現在等待耗時任務的同時,執行不依賴於該耗時任務結果的其他同步任務,提高效率。1 task非同步程式設計方法簽名及返回值 a 簽名有async 修飾符 b 方法名以 async 結尾 良好的編碼習慣 根據約定,將 async 追加到具有 async 修飾符的方法名稱。如...

非同步的使用 Task

新增task 引用命名空間 using system.threading.tasks console.writeline 主線程 task task new task task.start 啟動非同步 console.writeline load 執行上面 可以看到非同步是 最後才會執行 如果想放在...

Swoole Http服務 Task非同步任務

服務端 將物件傳入 ob start 執行應用並響應 trycatch exception e res ob get contents ob end clean response end res 必須是字串 task任務 public function ontask serv taskid work...