首頁 > 後端開發 > C++ > 如何在 C# 中同步呼叫非同步方法而不出現死鎖?

如何在 C# 中同步呼叫非同步方法而不出現死鎖?

Patricia Arquette
發布: 2025-01-19 13:52:12
原創
444 人瀏覽過

How Can I Synchronously Call an Asynchronous Method in C# Without Deadlocks?

同步呼叫非同步方法

假設有一個非同步方法,例如GenerateCodeAsync(),它會傳回一個任務。要同步呼叫此方法,需要找到一種方法來協調同步和非同步程式碼。

一種解決方案是在線程池線程中運行非同步方法,並使用awaiter阻塞線程,直到操作完成:

string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();
登入後複製

直接使用.Result的缺點

直接存取Result屬性可能導致:

  • 死鎖:Result的呼叫阻塞主線程,阻止非同步程式碼執行。
  • AggregateExceptions:非同步方法拋出的任何異常都會包裝在AggregateException中。

為了避免這些問題,GetAwaiter().GetResult()方法:

  • 在執行緒池執行緒中執行非同步方法,避免死鎖。
  • 解包任何拋出的異常,無需額外的區塊處理程序即可存取它們。

以上是如何在 C# 中同步呼叫非同步方法而不出現死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板