为什么Task.Delay()允许无限延迟?

问题描述 投票:13回答:3

[我的应用程序冻结后,我将原因归结为一个线程,等待一个由Task.Delay()(或.NET 4.0中的TaskEx.Delay())创建的任务,该线程为其提供了计算出的TimeSpan,由于错误,该任务是有时计算得出的TimeSpanTotalMilliseconds小于或等于-1且大于-2(即,介于-10000到-19999之间的任何数字,包括端点)。

[看起来,当您传递TimeSpan毫秒或更低的负-2时,该方法正确抛出ArgumentOutOfRangeException,但是当您提供上述范围内的负TimeSpan时,它将返回Task永远不会完成(通过将基础System.Threading.Timer设置为dueTime -1(表示无穷大))。这意味着在该任务上设置的任何继续将永远不会执行,并且该.Wait()Task上发生的任何不良线程将永远被阻止。

从未完成的Task有什么可能的用途?有人会期望这样的返回值吗?传递给.Delay()的任何负值(包括该特殊范围内的值)是否都不应抛出ArgumentOutOfRangeException

.net .net-4.0 task-parallel-library .net-4.5 async-await
3个回答
11
投票
Win32 API还对无限超时使用常量INFINITE = -1。

您通常不希望在UI线程中使用它,因为它可能冻结UI(这似乎是您的问题)。但是工作线程中有有效的用例-例如阻止等待客户端连接的服务器。


4
投票
Web Job

2
投票
© www.soinside.com 2019 - 2024. All rights reserved.