我有对Web服务进行异步调用的方法。这样的事情:
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp();
return await OtherClass.ProcessAsync(r);
}
我想提供同步替代方案:
public static ReturnResultClass GetBasicResponse()
{
return GetBasicResponseAsync().Result;
}
但它阻止Result
来电。因为它与异步操作在同一个线程上调用。如何同步获得结果?
谢谢!
答案 0 :(得分:9)
你是对的,如果你在GUI应用程序中,async
方法的延续部分将默认在UI线程上执行。如果你同时在UI线程上执行同一个Task的同步等待,你就会陷入僵局。
如果是你的应用程序,你可以通过不等同步任务来解决这个问题。
如果您只是在编写库,可以使用ConfigureAwait(false)
来解决此问题。这样,方法的continuation部分将不会在捕获的上下文(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()
,以便其他人可以使用这些方法的同步版本,如果他们想。