You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

net7.0中Task.Delay()取消异常:未抛出TaskCanceledException?

.NET 7与.NET 6中Task.Delay结合Console.CancelKeyPress的取消行为差异

问题澄清

原提问最初误以为在.NET 7中执行await Task.Delay(longTimeOut, cancellationToken);时,令牌触发取消后不会抛出TaskCanceledException而是持续等待,但后续补充纠正了这一误解:Task.Delay本身的取消逻辑在.NET 7中并未失效,实际差异来自Console.CancelKeyPress引发的进程终止行为。

核心差异说明

  • 在.NET 6中,当通过Console.CancelKeyPress(如按下Ctrl+C)触发进程终止时,系统会预留充足时间让关联了取消令牌的任务完成取消流程:Task.Delay会检测到令牌取消,抛出TaskCanceledException,相关取消处理代码也能正常执行。
  • 在.NET 7中,Console.CancelKeyPress触发的进程终止逻辑被优化得更快,进程会在取消处理代码(包括Task.Delay抛出异常的逻辑)执行前就完成终止,导致开发者看不到预期的TaskCanceledException,误以为是Task.Delay未正常响应取消。

验证方式

若不通过Console.CancelKeyPress触发取消,而是手动调用CancellationTokenSource.Cancel()来触发令牌取消,.NET 7中的Task.Delay依然会立即抛出TaskCanceledException,这说明Task.Delay的取消逻辑本身在.NET 7中是正常工作的。

内容的提问来源于stack exchange,提问作者sharpener

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33