Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取异步方法的结果_C#_Async Await_C# 5.0 - Fatal编程技术网

C# 获取异步方法的结果

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应用程序中,默

我有一个对web服务进行异步调用的方法。诸如此类:

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);
}