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
相关产品推荐
相关产品推荐

