获取async方法的结果

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()在库中使用,以便其他人可以根据需要使用方法的同步版本.