首頁 >後端開發 >C++ >如何在C#中同步呼叫非同步方法?

如何在C#中同步呼叫非同步方法?

DDD
DDD原創
2025-01-19 13:36:09619瀏覽

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

同步執行非同步方法

C# 中的非同步程式設計提供了一種有效的方法來處理長時間運行的操作,而無需凍結主應用程式執行緒。 但是,可能會出現需要從同步上下文同步呼叫非同步方法的情況。

解:使用Task.Run

為了實現非同步方法的同步執行,Task.Run方法提供了一個實用的解決方案。 它將非同步操作卸載到線程池線程,允許呼叫線程等待完成:

<code class="language-csharp">string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();</code>

為什麼要避免直接使用.Result

雖然存取任務的 Result 屬性看起來很簡單,但它有兩個潛在風險:

  1. 死鎖場景:如果非同步操作在主執行緒已經被阻塞等待結果時嘗試存取主執行緒,則直接使用 .Result 可能會導致死鎖。 Task.Run 透過在單獨的執行緒上執行非同步操作來減輕這種風險。
  2. 異常處理: .Result 屬性將來自非同步方法的異常包裝在 AggregateException 中。 使用 .GetAwaiter().GetResult() 透過展開異常來避免這種情況,簡化錯誤處理。

總結

Task.Run 與其等待程式結合使用,可以提供一種可靠且高效的方法,用於在同步程式碼中同步呼叫非同步方法。此方法避免了潛在的死鎖並簡化了異常管理。

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

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