首頁 >後端開發 >C++ >Await Task.Run 與 Await Async:什麼時候該選哪一個?

Await Task.Run 與 Await Async:什麼時候該選哪一個?

Linda Hamilton
Linda Hamilton原創
2025-01-22 18:36:13786瀏覽

Await Task.Run vs. Await Async: When Should You Choose Which?

.NET非同步程式設計:await Task.Runawait Async方法的選擇

在.NET非同步程式設計中,await Task.Runawait非同步方法的使用常常令人困惑。本文將透過一個具體場景來闡明兩者之間的區別,並提供全面的理解。

場景:

考慮以下兩個程式碼片段:

<code class="language-csharp">await Task.Run(() => LongProcess());</code>

<code class="language-csharp">await LongProcess();</code>

其中LongProcess是一個非同步方法,包含非同步調用,例如await ExecuteReaderAsync()

解答:

在這個特定場景中,兩種方法之間沒有顯著差異。兩者都使用await關鍵字,在LongProcess中的非同步操作完成之前,將控制權傳回給呼叫方。

非同步執行的本質

與普遍認知相反,非同步程式碼並非在多個執行緒上執行。相反,它在一個執行緒上執行,利用一種稱為“上下文切換”的技術。

當一個非同步函數呼叫另一個非同步函數時,目前執行緒暫時掛起呼叫方的執行,繼續執行被呼叫方。然後,作業系統將掛起的執行緒分配給其他可用的任務。

然而,一旦在被呼叫方中遇到await語句,當前執行緒就會回到呼叫方,有效地恢復呼叫方的執行。

直接await非同步方法的優點

在給定的場景中,由於LongProcess已經是非同步方法,因此無需在await它之前明確地將其包裝在Task.Run中。直接await非同步方法允許執行緒在等待LongProcess完成時立即開始執行其他任務。

Task.Run的使用場景

Task.Run有其特定的用例,例如:

  • 啟動一個新任務而不等待它,允許非阻塞執行耗時操作。
  • 在後台執行緒上執行可能佔用大量CPU的操作,釋放UI執行緒以實現響應式使用者互動。

總結

在給出的場景中,兩種方法在功能上是等效的。但是,直接await非同步方法更可取,因為它減少了執行緒切換,並允許更有效地使用執行緒池。

以上是Await Task.Run 與 Await Async:什麼時候該選哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn