C# 获取异步方法的结果
我有一个对web服务进行异步调用的方法。诸如此类:C# 获取异步方法的结果,c#,async-await,c#-5.0,C#,Async Await,C# 5.0,我有一个对web服务进行异步调用的方法。诸如此类: public static async Task<ReturnResultClass> GetBasicResponseAsync() { var r = await SomeClass.StartAsyncOp(); return await OtherClass.ProcessAsync(r); } 但它会阻塞结果调用。因为它与异步操作在同一线程上调用。如何同步获得结果 谢谢 没错,如果您在GUI应用程序中,默
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp();
return await OtherClass.ProcessAsync(r);
}
但它会阻塞结果
调用。因为它与异步操作在同一线程上调用。如何同步获得结果
谢谢 没错,如果您在GUI应用程序中,默认情况下,
async
方法的延续部分将在UI线程上执行。如果同时在UI线程上对同一任务执行同步等待,则会出现死锁
如果是您的应用程序,您可以通过不同步等待任务来解决此问题
如果您只是在编写一个库,您可以通过使用来解决这个问题。这样,方法的延续部分将不会在捕获的上下文(GUI应用程序中的UI线程)上执行,而是在线程池线程上执行
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp().ConfigureAwait(false);
return await OtherClass.ProcessAsync(r).ConfigureAwait(false);
}
公共静态异步任务GetBasicResponseAsync()
{
var r=await SomeClass.StartAsyncOp().ConfigureAwait(false);
返回wait OtherClass.ProcessAsync(r).ConfigureWait(false);
}
当然,理想的解决方案是不要在GUI应用程序中使用同步操作,而是在库中使用
ConfigureAwait()
,以便其他人可以根据需要使用同步版本的方法。谢谢!ConfigureAwait
会影响我的库的异步客户端吗?我的意思是,异步操作会保持异步,还是会在其他线程上为所有客户端执行?是的,它也会影响异步客户端,但在某种程度上应该是可以的。异步操作将保持异步,只是使用ConfigureAwait()
的代码的继续部分不会在UI线程上执行。但是在UI线程上启动的方法中的任何异步代码都将保留在那里(除非您也在那里使用ConfigureAwait()
)。
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp().ConfigureAwait(false);
return await OtherClass.ProcessAsync(r).ConfigureAwait(false);
}