在C#中同步方法调用异步方法
在同步代码中调用异步方法(通常用async修饰符标识)是一个常见的开发难题。异步编程能够在保持UI响应性的同时执行长时间运行的操作,但这通常需要调整代码结构,而这可能与现有的同步方法不符。
方案一:Task.WaitAndUnwrapException
如果异步方法(MyAsyncMethod)可以独立运行,无需上下文同步,则可以使用Task.WaitAndUnwrapException提供一个简单的解决方案:
var task = MyAsyncMethod(); var result = task.WaitAndUnwrapException();
但是,使用Task.Wait或Task.Result时需要注意,它们会将异常包装在AggregateException中。
方案二:AsyncContext.RunTask
或者,如果MyAsyncMethod需要上下文同步,AsyncContext.RunTask提供了一种嵌套上下文的方法:
var result = AsyncContext.RunTask(MyAsyncMethod).Result;
方案三:Task.Run
在某些情况下,AsyncContext.RunTask可能会受到限制,例如依赖于UI事件的异步方法。在这种情况下,可以在线程池上执行异步方法:
var task = Task.Run(async () => await MyAsyncMethod()); var result = task.WaitAndUnwrapException();
请注意,此方法要求MyAsyncMethod能够在线程池上下文中兼容,包括对UI元素更新和ASP.NET请求上下文访问的限制。
以上是如何从C#中的同步方法调用异步方法?的详细内容。更多信息请关注PHP中文网其他相关文章!