gpt4 book ai didi

c# - TaskCanceledException 是否意味着发生了死锁?

转载 作者:行者123 更新时间:2023-11-30 21:45:34 25 4
gpt4 key购买 nike

我正在努力使我们的一个应用程序异步,现在当我调用 SendAsync 时我的 HttpClient 超时(我得到一个 TaskCanceledException)。这是超时的代码:

            response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
.ConfigureAwait(false);

据我了解,ConfigureAwait(false) 意味着我不能死锁此任务。我一直在等待这个堆栈的上层(或下层)。

当我在 postman 中提出相同的请求时,它需要不到一秒钟的时间。我的 HttpClient 的超时时间是 2 分钟。还会有其他事情发生吗?

另外,因为我得到了一个 TaskCanceledException 这是否意味着我的任务没有死锁?

更新

感谢@Servy 的回答,我已经通过将上面的代码更改为以下方式解决了我的问题:

            response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
.ConfigureAwait(false).GetAwaiter().GetResult();

因此,如果我不等待它,一切都会正常进行。这是否意味着它很可能是某个地方的死锁?

最佳答案

From what I understand, ConfigureAwait(false) means that I can't deadlock this task.

那不是真的。每当您同步等待异步操作的同步上下文时,您都会遇到死锁,而异步操作试图在同一同步上下文上执行延续。 这个 continuation 没有尝试使用同步上下文并不意味着其他地方没有其他continuation。因此,虽然我们知道 await 不是导致死锁的原因,但这并不意味着没有死锁。

I am awaiting for this all the way up(or down) the stack.

如果这是真的,并且没有任何同步阻塞同步上下文,那么将意味着您的代码中没有死锁。 (或者至少,不是这种常见的死锁来源。)

When I make the same request in postman it takes will under a second. The timeout for my HttpClient is 2 minutes. Could there be something else going on?

当然。防火墙可能会妨碍您,您的网络线可能已被拔掉,其他站点可能处于离线状态,或者出于某种原因故意忽略您的请求。

Also, because I am getting a TaskCanceledException does that mean that my Tasks are not deadlocked?

它并没有真正告诉你任何一种方式。如果试图在阻塞的同步上下文上安排继续的特定操作也有一个取消 token ,导致它在一段时间后超时,那么它会死锁,直到它被取消。但是当然有很多事情可能导致 Task 在没有死锁的情况下被取消。

关于c# - TaskCanceledException 是否意味着发生了死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024226/

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