同步调用异步方法
问题:
您有一个如下签名的异步方法:
<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中文网其他相关文章!