[我的应用程序冻结后,我将原因归结为一个线程,等待一个由Task.Delay()
(或.NET 4.0中的TaskEx.Delay()
)创建的任务,该线程为其提供了计算出的TimeSpan
,由于错误,该任务是有时计算得出的TimeSpan
的TotalMilliseconds
小于或等于-1
且大于-2
(即,介于-10000到-19999之间的任何数字,包括端点)。
[看起来,当您传递TimeSpan
毫秒或更低的负-2
时,该方法正确抛出ArgumentOutOfRangeException
,但是当您提供上述范围内的负TimeSpan时,它将返回Task
永远不会完成(通过将基础System.Threading.Timer
设置为dueTime
-1(表示无穷大))。这意味着在该任务上设置的任何继续将永远不会执行,并且该.Wait()
上Task
上发生的任何不良线程将永远被阻止。
从未完成的Task
有什么可能的用途?有人会期望这样的返回值吗?传递给.Delay()
的任何负值(包括该特殊范围内的值)是否都不应抛出ArgumentOutOfRangeException
?
您通常不希望在UI线程中使用它,因为它可能冻结UI(这似乎是您的问题)。但是工作线程中有有效的用例-例如阻止等待客户端连接的服务器。