Почему Task.Delay ()допускает бесконечную задержку?

После того, как мое приложение зависло, я отследил причину в потоке, ожидающем задачи, созданной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?

12
задан Allon Guralnek 24 May 2012 в 16:13
поделиться