同步呼叫非同步方法
問題:
您有一個如下簽名的非同步方法:
<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
的缺點:
.Result
可能會導致死鎖,因為主執行緒被阻塞,從而妨礙非同步方法的完成。為防止這種情況,請謹慎使用.ConfigureAwait(false)
。這種方法並非沒有其複雜性。但是,使用Task.Run
在執行緒池執行緒上執行非同步方法消除了此潛在問題。 .Result
將非同步方法中拋出的任何異常封裝在AggregateException
中。為了避免這個問題,請改用.GetAwaiter().GetResult()
。 以上是如何在C#中同步呼叫非同步方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!