.NET非同步程式設計:await Task.Run
與await Async
方法的選擇
在.NET非同步程式設計中,await Task.Run
和await
非同步方法的使用常常令人困惑。本文將透過一個具體場景來闡明兩者之間的區別,並提供全面的理解。
場景:
考慮以下兩個程式碼片段:
<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
有其特定的用例,例如:
總結
在給出的場景中,兩種方法在功能上是等效的。但是,直接await
非同步方法更可取,因為它減少了執行緒切換,並允許更有效地使用執行緒池。
以上是Await Task.Run 與 Await Async:什麼時候該選哪一個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!