5

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

谢谢!

4

1 回答 1

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

当然,理想的解决方案是不在您的 GUI 应用程序中使用同步操作,而是ConfigureAwait()的库中使用,以便其他人可以根据需要使用方法的同步版本。

于 2012-03-03T14:28:52.203 回答