После того, как мое приложение зависло, я отследил причину в потоке, ожидающем задачи, созданнойTask.Delay()
(или TaskEx.Delay()
в.NET 4.0 ), для которого было предоставлено вычисленное TimeSpan
, которое из-за ошибки иногда вычислялось до TimeSpan
с TotalMilliseconds
, меньшим или равным -1
и больше, чем-2
(то есть где-то между -10000 до -19999 тиков включительно ).
Похоже, что когда вы передаете отрицательное TimeSpan
, то есть -2
миллисекунд или меньше, метод правильно выдает ArgumentOutOfRangeException
, но когда вы предоставляете отрицательное время TimeSpan из диапазона, описанного выше, он возвращает Task
, который никогда не завершает (, устанавливая базовый System.Threading.Timer
в dueTime
из -1, что обозначает бесконечность ). Это означает, что любые продолжения, установленные для этой задачи, никогда не будут выполняться, и любой плохой поток, который произойдет с .Wait()
на этой Task
, будет навсегда заблокирован.
Какая возможная польза может быть от Task
, которая никогда не завершается? Кто-нибудь ожидал бы такого возвращаемого значения? Разве любое отрицательное значение, переданное в .Delay()
, включая значения в этом специальном диапазоне, не должно вызывать ArgumentOutOfRangeException
?