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