Nachdem meine Anwendung einfror, habe ich die Ursache zu einem Thread auf eine Aufgabe von Task.Delay()
(oder TaskEx.Delay()
in .NET 4.0), für die es eine berechnete TimeSpan
, die aufgrund eines Fehlers, wurde gelegentlich zu einer TimeSpan
berechnet wurde warten auf einen Thread mit einer TotalMilliseconds
von kleiner oder gleich -1
und größer als -2
(dh irgendwo zwischen -10000 bis -19999 Ticks, inklusive).Warum erlaubt Task.Delay() eine unendliche Verzögerung?
Es scheint, dass, wenn Sie eine negative TimeSpan
übergeben, die -2
Millisekunden oder weniger beträgt, wobei das Verfahren korrekt ein ArgumentOutOfRangeException
wirft, aber wenn man einen negativen Zeitraum von dem oben beschriebenen Bereich bereitzustellen, gibt es eine Task
, die nie Einstellung (von abgeschlossen der zugrundeliegende System.Threading.Timer
zu einem dueTime
von -1, der unendlich bezeichnet). Das bedeutet, dass alle Fortsetzungen, die für diese Aufgabe festgelegt wurden, niemals ausgeführt werden und ein fehlerhafter Thread, der mit .Wait()
auf dieser Task
passiert, wird für immer blockiert.
Welche mögliche Verwendung kann eine Task
, die nie abgeschlossen haben? Würde jemand solch einen Rückgabewert erwarten? Sollte kein negativer Wert an .Delay()
übergeben werden, einschließlich Werte in diesem speziellen Bereich, einen ArgumentOutOfRangeException
werfen?
Das MSDN-Dokument ist ziemlich explizit in -1, so scheint es korrekt zu sein. Ich bin mir nicht sicher über den Anwendungsfall für diese Überladung, aber es könnte eine Art sein, auf eine "nur" Löschung mit der Überlast zu warten, die ein Löschungs-Token benötigt. –
@James: Es ist nicht explizit erlaubt -1, es ist explizit zu verbieten Werte unter -1. Es wird nicht einmal gesagt, was passieren wird, wenn Sie -1 übergeben, anders als in der Dokumentation von 'System.Threading.Timer'. Es scheint fast so, als ob die dokumentierte Liste der Ausnahmen automatisch aus dem Quellcode generiert würde. Und wenn Sie auf "nur" eine Absage warten, warum rufen Sie sogar "Task.Delay()" an? –
Wenn Sie denken, dass es kaputt ist, melden Sie einen Fehler beim Verbinden. Ein Dokument, das sagt "niedriger als -1 ist ungültig", ist explizit (für mich), dass -1 gültig ist. Wenn die Absicht -1 als ungültig wäre, wäre "niedriger als 0 ungültig" einfacher zu schreiben. Da das doc und der Code beide -1 erlauben, denke ich, dass dies By Design ist, aber fühlen Sie sich frei, einen Fehler beim Verbinden zu machen (eher vom BCL-Team verarbeitet als ein zufälliger SO-Thread, würde ich denken :) –