gor*_*gor 5 c# async-await c#-5.0
我有对Web服务进行异步调用的方法.像这样的东西:
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp();
return await OtherClass.ProcessAsync(r);
}
Run Code Online (Sandbox Code Playgroud)
我想提供同步替代方案:
public static ReturnResultClass GetBasicResponse()
{
return GetBasicResponseAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)
但它Result随叫随到.因为它与异步操作在同一个线程上调用.如何同步获得结果?
谢谢!
svi*_*ick 10
你是对的,如果你在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);
}
Run Code Online (Sandbox Code Playgroud)
当然,理想的解决方案是不在GUI应用程序中使用同步操作并ConfigureAwait()在库中使用,以便其他人可以根据需要使用方法的同步版本.
| 归档时间: |
|
| 查看次数: |
6229 次 |
| 最近记录: |