gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:27:48 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com