Po tym, jak moja aplikacja przestała działać, wyśledziłem przyczynę wątku oczekującego na zadanie utworzone przez Task.Delay()
(lub TaskEx.Delay()
w .NET 4.0), dla którego podano obliczoną wartość TimeSpan
, która z powodu błędu była czasami obliczana na TimeSpan
z wartością TotalMilliseconds
mniejszą niż lub równą -1
i większą niż -2
(tj. od -10000 do -19999 znaczników włącznie).Dlaczego funkcja Task.Delay() zezwala na nieskończone opóźnienie?
Wydaje się, że kiedy przechodzą negatywny TimeSpan
czyli -2
milisekund lub niższy, sposób prawidłowo zgłasza ArgumentOutOfRangeException
, ale gdy podasz negatywny Okres z zakresu opisanego powyżej, zwraca Task
że nigdy nie kończy (poprzez ustawienie podstawowy System.Threading.Timer
do dueTime
z -1, który oznacza nieskończoność). Oznacza to, że wszelkie kontynuacje ustawione dla tego zadania nigdy nie zostaną wykonane, a każdy ubogi wątek, który stanie się .Wait()
na tym Task
, zostanie na zawsze zablokowany.
Jakie możliwe zastosowanie może mieć Task
, które nigdy nie zostanie ukończone? Czy ktokolwiek oczekiwałby takiej wartości zwrotu? Czy nie powinna być przekazywana żadna wartość ujemna do .Delay()
, w tym wartości w tym zakresie specjalnym, wyrzucić ArgumentOutOfRangeException
?
Dokument MSDN jest dość jednoznaczny w dopuszczeniu wartości -1, więc wygląda na to, że zachowuje się poprawnie. Nie jestem pewien przypadku użycia dla tego przeciążenia, ale może to być sposób oczekiwania na "sprawiedliwe" anulowanie z przeciążeniem, które pobiera token anulowania. –
@James: Nie jest jednoznaczne zezwalanie na -1, oznacza to niedozwolone wartości mniejsze niż -1. Nie mówi nawet, co się stanie, jeśli zdasz -1, w przeciwieństwie do dokumentacji "System.Threading.Timer". Wygląda na to, że udokumentowana lista wyjątków została automatycznie wygenerowana z kodu źródłowego. A jeśli czekasz na "sprawiedliwe" anulowanie, to dlaczego chcesz wykonać połączenie z 'Task.Delay()'? –
, jeśli uważasz, że jest zepsuty, zgłoś błąd na łączu. Dokument, który mówi "niższy niż -1 jest nieprawidłowy" jest wyraźny (dla mnie) mówiąc, że -1 jest prawidłowe. Jeśli intencją było -1 jako nieważne "mniej niż 0 jest nieprawidłowe" byłoby łatwiejsze do napisania. Ponieważ zarówno dokument, jak i kod pozwalają na -1, myślę, że jest to według projektu, ale możesz wysłać plik o błędzie na połączenie (prawdopodobnie będzie to przetwarzane przez zespół BCL niż losowy wątek SO, tak mi się wydaje :) –