获取async方法的结果

时间:2012-03-03 11:48:51

标签: c# async-await c#-5.0

我有对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来电。因为它与异步操作在同一个线程上调用。如何同步获得结果?

谢谢!

1 个答案:

答案 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(),以便其他人可以使用这些方法的同步版本,如果他们想。