我有对网络服务进行异步调用的方法。类似的东西:
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp();
return await OtherClass.ProcessAsync(r);
}
我想提供同步替代方案:
public static ReturnResultClass GetBasicResponse()
{
return GetBasicResponseAsync().Result;
}
但它会阻止 Result
调用。因为它是在与异步操作相同的线程上调用的。如何同步获取结果?
谢谢!
最佳答案
您是对的,如果您在 GUI 应用程序中,async
方法的后续部分默认将在 UI 线程上执行。如果同时在 UI 线程上对同一个 Task 执行同步等待,则会出现死锁。
如果是您的应用程序,您可以通过简单地不同步等待任务来解决这个问题。
如果您只是在编写一个库,您可以使用 ConfigureAwait(false)
来解决这个问题.这样,该方法的延续部分将不会在捕获的上下文(GUI 应用程序中的 UI 线程)上执行,而是在 ThreadPool 线程上执行。
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp().ConfigureAwait(false);
return await OtherClass.ProcessAsync(r).ConfigureAwait(false);
}
当然,理想的解决方案是不要在您的 GUI 应用程序中使用同步操作并且在您的库中使用ConfigureAwait()
,这样其他人就可以使用同步版本的方法,如果他们愿意的话。
关于c# - 获取异步方法的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545885/