我正在努力使我们的应用程序之一异步,现在当我调用SendAsync时,我的HttpClient超时(我得到TaskCanceledException
)。这是超时的代码:
response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
.ConfigureAwait(false);
据我所知,ConfigureAwait(false)
意味着我无法将此任务陷入僵局。我正在等待堆栈中的所有方式(或者向下)。
当我在邮递员中提出相同的请求时,需要一秒钟。我的HttpClient的超时是2分钟。可能会有其他事情发生吗?
另外,因为我收到TaskCanceledException
这意味着我的任务没有陷入僵局?
更新
感谢@Servy的回答,我已经设法通过将上面的代码更改为:
来解决我的问题 response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
.ConfigureAwait(false).GetAwaiter().GetResult();
所以,如果我不等待它,一切正常。这是否意味着它很可能在某个地方陷入僵局?
答案 0 :(得分:3)
根据我的理解,
ConfigureAwait(false)
意味着我不能使这项任务陷入僵局。
那不是真的。每当您在尝试在同一同步上下文上执行延续的异步操作上同步等待同步上下文时,您就会遇到死锁。那个这个延续不是试图使用同步上下文并不意味着在其他地方没有其他的延续。因此,虽然我们知道这个await
不是造成死锁的原因,但并不意味着没有一个。
我正在等待这一直到(或向下)堆栈。
如果这是真的,并且没有任何同步阻止同步上下文,则 意味着您的代码中没有死锁。 (或者至少,这不是死锁的常见原因。)
当我在邮递员中提出相同的请求时,需要一秒钟。我的HttpClient的超时是2分钟。可能会有其他事情发生吗?
不确定。防火墙可能会阻碍,您的网络线路可能已拔下,其他网站可能处于脱机状态,或出于某种原因故意忽略您的请求。
另外,因为我收到TaskCanceledException这是否意味着我的任务没有死锁?
它无论如何都没有告诉你。如果尝试在阻塞的同步上下文中安排延续的特定操作也有一个取消令牌,导致它在一段时间后超时,那么它将一直死锁直到它被取消。但是当然有很多事情会导致Task
在没有死锁的情况下被取消。