同步执行异步方法
C# 中的异步编程提供了一种有效的方法来处理长时间运行的操作,而无需冻结主应用程序线程。 但是,可能会出现需要从同步上下文同步调用异步方法的情况。
解决方案:使用Task.Run
为了实现异步方法的同步执行,Task.Run
方法提供了一个实用的解决方案。 它将异步操作卸载到线程池线程,允许调用线程等待完成:
<code class="language-csharp">string code = Task.Run(() => GenerateCodeAsync()).GetAwaiter().GetResult();</code>
为什么要避免直接使用.Result
?
虽然访问任务的 Result
属性可能看起来很简单,但它存在两个潜在风险:
.Result
可能会导致死锁。 Task.Run
通过在单独的线程上执行异步操作来减轻这种风险。.Result
属性将来自异步方法的异常包装在 AggregateException
中。 使用 .GetAwaiter().GetResult()
通过展开异常来避免这种情况,简化错误处理。总结
将 Task.Run
与其等待程序结合使用,可以提供一种可靠且高效的方法,用于在同步代码中同步调用异步方法。此方法避免了潜在的死锁并简化了异常管理。
以上是如何在C#中同步调用异步方法?的详细内容。更多信息请关注PHP中文网其他相关文章!