簡體   English   中英

是否將await用於后台線程?

[英]Use await for background threads or not?

我目前正在使用async / await關鍵字,並經歷了以下問題: 正確使用Task.Run以及何時僅使用async-awaitAsync / Await與線程

但是,即使第二個鏈接也無法回答我的問題,那就是何時使用

Task.Run(...)

await Task.Run(...)

是情境還是通過使用await(然后返回到調用方)可以得到什么?

代碼Task.Run(...) (在兩個示例中)都將委托發送到線程池,並返回一個包含該委托結果的任務。 這些“結果”可以是實際的返回值,也可以是例外。 您可以使用返回的任務來檢測結果何時可用(即,委托完成的時間)。

因此,如果滿足以下任一條件 ,則應使用Task

  • 您需要檢測操作何時完成並以某種方式做出響應。
  • 您需要知道操作是否成功完成。
  • 您需要處理操作中的異常。
  • 您需要對操作的返回值進行操作。

如果您的調用代碼需要執行上述任何操作,請使用await

await Task.Run(...);

長時間運行的后台任務,有時你想要做的那些(例如,檢測例外),但你不想做的時候了 ; 在這種情況下,只需保存Task ,然后在應用程序中的其他位置await它:

this.myBackgroundTask = Task.Run(...);

如果您不需要上述任何一項,則可以執行“射擊后遺忘”,如下所示:

var _ = Task.Run(...); // or just "Task.Run(...);"

請注意,真正的“一勞永逸”應用程序極為罕見 字面上的意思是“運行此代碼,但是我不在乎它是否完成,何時完成或是否成功”。

您可以在使用即發即類型處理邏輯時使用Task.Run() ,類似於如果有人訂閱了事件則調用事件。 您可以將其用於日志記錄,通知等。

如果依賴於方法中執行的結果或操作,則需要使用await Task.Run(),因為它會暫停當前執行直到任務完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM