gpt4 book ai didi

c# - 等待 Task.Result 会如何影响嵌套的异步/等待方法?

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

这有点啰嗦,但是这里......

鉴于我有这样的界面:

public interface IWebClientHelper
{
TPayload Get<TPayload>(string url);
}

在哪里执行Get调用提供的 URL,它将返回一个包含 TPayload 类型的 Json 对象的响应), 并且 Json 被反序列化为 TPayload然后返回。

我想执行 Get方法异步(或更具体地说,使 Get 方法中包含的 HTTP 调用异步),但据我了解,这需要 Get 的签名方法改为:

Task<TPayload> Get<TPayload>(string url);

我的目标是保持界面原样,所以我创建了第二个界面:

public interface IAsyncWebClientHelper
{
Task<TPayload> Get<TPayload>(string url);
}

并将其注入(inject)到我的 IWebClientHelper 实现中.所以现在我执行 IWebClientHelper看起来像这样:

public TPayload Get<TPayload>(string url)
{
return _asyncWebClientHelper.Get<TPayload>(url).Result;
}

Get _asyncWebClientHelper的方法|包含行

message = await httpClient.GetAsync(url);

所以我不清楚的是:我认为 return _asyncWebClientHelper.Get<TPayload>(url).Result 这行是否正确?将阻止执行直到该方法返回?或者将 await该方法中的关键字释放线程,直到它收到来自 url 的响应?

最佳答案

是的,使用 Result 意味着您的方法将阻塞。但是,这很可能意味着它实际上会导致死锁。您没有告诉我们太多关于上下文的信息,但是如果您在 await 之后需要返回到同一线程的上下文中,但该线程由于 而被阻塞>Result,你基本上陷入了 self 僵局。在使用任何阻塞调用(例如 Result 属性或 Wait() 方法)时,您需要非常小心。

从根本上说,尝试使用异步而不使您的界面异步是棘手的​​/毫无意义的。你最好全心全意地拥抱异步,或者坚持使用同步版本。毕竟,如果您打算在异步任务完成之前保持线程阻塞,那么异步首先有什么好处?

关于c# - 等待 Task.Result 会如何影响嵌套的异步/等待方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18595847/

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