gpt4 book ai didi

c# - 无需等待即可调用异步方法 #2

转载 作者:IT王子 更新时间:2023-10-29 03:57:29 25 4
gpt4 key购买 nike

我有一个异步方法:

public async Task<bool> ValidateRequestAsync(string userName, string password)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
string stringResponse = await response.Content.ReadAsStringAsync();

return bool.Parse(stringResponse);
}
}

我这样调用这个方法:

bool isValid = await ValidateRequestAsync("user1", "pass1");

我可以在不使用 await 关键字的情况下从同步方法调用相同的方法吗?

例如:

public bool ValidateRequest(string userName, string password)
{
return ValidateRequestAsync(userName, password).Result;
}

我认为这会导致死锁。

编辑

像上面那样调用方法使调用永不结束。 (该方法不再走到尽头)

最佳答案

如果从单线程执行上下文调用异步方法,比如UI线程,同步等待结果,死锁的概率很高。在您的示例中,该概率为 100%

想一想。当你打电话时会发生什么

ValidateRequestAsync(userName, password).Result

您调用方法 ValidateRequestAsync。在那里你调用 ReadAsStringAsync。结果是任务将返回到 UI 线程,并计划继续在 UI 线程可用时继续执行。但是当然,它永远不会变得可用,因为它正在等待(阻塞)任务完成。但是任务无法完成,因为它正在等待 UI 线程可用。死锁。

有很多方法可以防止这种僵局,但它们都是一个坏主意。为了完整起见,以下可能有效:

Task.Run(async () => await ValidateRequestAsync(userName, password)).Result;

这是个坏主意,因为您仍然会阻塞 UI 线程等待并且无所事事。

那么解决方案是什么?一路异步。 UI 线程上的原始调用者可能是某个事件处理程序,因此请确保它是异步的。

关于c# - 无需等待即可调用异步方法 #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786441/

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