任务取消异常是否意味着发生了死锁?

3

我正在将我们的一个应用程序改成异步方式,但是当我调用 SendAsync 时,我的 HttpClient 超时(我收到了一个 TaskCanceledException)。以下是超时的代码:

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

据我所知,ConfigureAwait(false) 的意思是我不能使这个任务死锁。我在整个堆栈中一直等待它(向上或向下)。
当我在Postman中发出相同的请求时,只需要不到一秒钟。我的HttpClient的超时时间是2分钟。可能还有其他问题吗?
另外,因为我得到了一个 TaskCanceledException ,这是否意味着我的Tasks没有死锁?
更新
感谢 @Servy 的答案,我已经通过将上面的代码更改为以下内容来解决我的问题:
            response = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
                .ConfigureAwait(false).GetAwaiter().GetResult();

所以如果我不等待它,一切正常工作。这是否意味着某处最可能存在死锁?

1个回答

3
据我所知,ConfigureAwait(false)的意思是,我不能将此任务死锁。
这并不正确。当您在等待同步上下文中的异步操作时,该异步操作正在尝试在同一同步上下文中执行继续工作时,您就会遇到死锁。即使这个继续工作没有试图使用同步上下文,也并不意味着没有其他继续工作在其他地方使用同步上下文。因此,虽然我们知道这个await不是导致死锁的原因,但并不意味着没有死锁。
如果这是真的,并且没有任何同步阻塞同步上下文,则意味着您的代码中没有死锁。(或者至少不是这种常见死锁的源头。)
当我在Postman中进行相同的请求时,它只需不到一秒钟就能完成。我的HttpClient的超时时间为2分钟。还有其他原因吗?
当然。可能有防火墙阻挡了请求,您的网络线可能已经拔掉了,对方站点可能已经离线,或者故意忽略您的请求。
此外,因为我收到了TaskCanceledException异常,这意味着我的任务没有死锁吗?
它并不能明确说明您的任务是否已死锁。如果特定操作尝试在被阻止的同步上下文中安排继续工作的同时又具有取消令牌,并导致在一段时间后超时,则它将死锁直到被取消。但是,可能有许多原因导致Task被取消而没有死锁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接