c# - 获取异步方法的结果

标签 c# async-await c#-5.0

我有对网络服务进行异步调用的方法。类似的东西:

public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
    var r = await SomeClass.StartAsyncOp();
    return await OtherClass.ProcessAsync(r);
}

我想提供同步替代方案:

public static ReturnResultClass GetBasicResponse()
{
    return GetBasicResponseAsync().Result;
}

但它会阻止 Result 调用。因为它是在与异步操作相同的线程上调用的。如何同步获取结果?

谢谢!

最佳答案

您是对的,如果您在 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(),这样其他人就可以使用同步版本的方法,如果他们愿意的话。

关于c# - 获取异步方法的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545885/

相关文章:

c# - 将 readline 语句居中

c# - tweetinvi 总是返回 null

c# - 如何在单击 Xamarin 按钮时添加自定义 View

python - 多个异步调用阻塞

c# - 异步等待长函数并发

c# - 分离 int 和 char 并生成整数

javascript - Node 异步/等待——我需要尝试/捕获吗?

c# - C#中基于任务的异步方法的超时模式

c# - 根据 Entity Framework 中的值按某些列进行分组

c# - C# 5.0异步中的awaitable和awaiter