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

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

Patricia Arquette
Patricia Arquette原創
2025-01-19 13:43:10798瀏覽

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

同步呼叫非同步方法

問題:

您有一個如下簽名的非同步方法:

<code class="language-c#">public async Task<string> GenerateCodeAsync()
{
    string code = await GenerateCodeService.GenerateCodeAsync();
    return code;
}</code>

但是,您需要在同步上下文中同步呼叫此方法。如何實現?

解:

為了同步呼叫非同步方法,您可以使用執行緒池執行緒來執行該方法。透過使用任務的awaiter,您可以阻塞呼叫線程,直到非同步操作完成:

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

注意事項:

要注意直接使用.Result的缺點:

  1. 死鎖: 使用.Result可能會導致死鎖,因為主執行緒被阻塞,從而妨礙非同步方法的完成。為防止這種情況,請謹慎使用.ConfigureAwait(false)。這種方法並非沒有其複雜性。但是,使用Task.Run在執行緒池執行緒上執行非同步方法消除了此潛在問題。
  2. 異常處理: .Result 將非同步方法中拋出的任何異常封裝在AggregateException中。為了避免這個問題,請改用.GetAwaiter().GetResult()

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

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