首頁 >後端開發 >C++ >C# 非同步程式設計中的「await」關鍵字後執行緒會發生什麼?

C# 非同步程式設計中的「await」關鍵字後執行緒會發生什麼?

Susan Sarandon
Susan Sarandon原創
2025-01-05 16:32:41888瀏覽

What Happens to the Thread After an `await` Keyword in C# Async Programming?

理解await關鍵字之後的執行緒行為

在非同步程式設計中,await關鍵字在管理執行緒和確保高效執行方面起著至關重要的作用。然而,理解遇到await後程式碼如何繼續進行可能會令人困惑。本文旨在透過詳細的探索來闡明這一點。

以以下程式碼片段為例:

private async Task MyAsyncMethod()
{
    // Code before await
    await MyOtherAsyncMethod();
    // Code after await
}

private void MyMethod()
{
    Task task = MyAsyncMethod();
    task.Wait();
}

當 MyAsyncMethod 中遇到 wait 關鍵字時,控制權會傳回給 MyMethod。這是因為 MyAsyncMethod 被標記為非同步。然而,由於隨後呼叫了task.Wait(),執行MyMethod的執行緒被阻塞,似乎阻止了await後程式碼的執行。

新執行緒會執行await後的程式碼嗎?

答案是:也許吧。此行為取決於等待表達式求值時「當前」的同步上下文的實作。

在提供的範例中,如果程式碼在 UI 執行緒上運行,則延續(程式碼在await之後)將在同一個UI執行緒上執行。另一方面,如果程式碼在執行緒池執行緒上運行,則可以在任何可用的執行緒池執行緒上執行延續。

避免執行緒阻塞

如果目標是立即執行await之後的程式碼,那麼避免使用task.Wait()或task.Result阻塞執行緒至關重要。相反,請考慮其他選項,例如註冊回調或使用等待任務本身。

控制執行緒親和性

對於延續需要特定執行緒親和性的場景,可以使用ConfigureAwait方法。透過將 false 傳遞給ConfigureAwait,可以明確指示延續在不同的執行緒上下文上運行。

其他資源

為了加深對await 的線程行為的理解,請參閱以下資源:

  • MSDN 文件: https:/ /docs.microsoft.com/en-us/dotnet/csharp/async/
  • C#深入探討,第三版:https://www.manning.com/books/csharp-in-deep -第三版
  • Tekpub 截圖影片系列: https://www.tekpub.com/category /257-asynchronous-programming-in-c-sharp

以上是C# 非同步程式設計中的「await」關鍵字後執行緒會發生什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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