Uygulamam donduktan sonra, bir hata nedeniyle, TimeSpan
numaralı hesaplanmış olan bir hesaplanmış TimeSpan
sağladığı Task.Delay()
(veya .NET 4.0'da TaskEx.Delay()
) tarafından oluşturulan bir görevde bekleyen bir iş parçacığının nedenini izledim. TotalMilliseconds
'dan -1
'a eşit veya daha az ve -2
'dan daha büyük (yani, -10000 ila -19999 arası keneler dahil olmak üzere).Task.Delay() neden sonsuz bir gecikmeye izin veriyor?
O ayarlayarak (eğer -2
milisaniye veya daha düşük olan bir negatif TimeSpan
geçerken, yöntemi doğru bir ArgumentOutOfRangeException
atar, ancak yukarıda açıklanan aralığından olumsuz TimeSpan sağlamak, bunun tamamlar asla bir Task
döndürdüğünü görünür altta yatan System.Threading.Timer
, sonsuza işaret eden bir dueTime
-l'e karşılık gelir). Bu, o görevde ayarlanan tüm ilerlemelerin hiçbir zaman yürütülmeyeceği anlamına gelir ve Task
üzerinde .Wait()
olan herhangi bir zayıf iş parçacığı sonsuza dek engellenir.
Hiçbir zaman tamamlanmayan, Task
nu doldurabilir? Böyle bir geri dönüş değeri beklenir mi? Bu özel aralıktaki değerler de dahil olmak üzere .Delay()
'a herhangi bir negatif değer geçmemeli, ArgumentOutOfRangeException
? Eksiksiz bir süreyi tamamlamak için süresiz olarak beklemek istediğiniz süreyi beklemek istediğinizde, ancak sonunda tamamlanacaksa,
MSDN dokümanı, -1'e izin verme konusunda oldukça açık, bu yüzden doğru davranıyor gibi görünüyor. Bu aşırı yüklenme için kullanım durumundan emin değilsiniz, ancak bir iptal belirteci alan aşırı yüklenmeyle 'adil' iptali için beklemenin bir yolu olabilir. –
@James: -1'e izin vermede açık değil, -1'den küçük değerlere izin vermiyor. "System.Threading.Timer" belgelerinin aksine -1 'i geçerseniz ne olacağını söyleyemez. Neredeyse belgelenen özel durum listesi kaynak kodundan otomatik olarak oluşturulmuş gibi görünüyor. Ve eğer 'adil' iptal için bekliyoruz, neden bile 'Task.Delay()' için bir çağrı yapmak? –
Bozuk olduğunu düşünüyorsanız, bağlantıda bir hata yapın. -1'in altında olduğunu belirten bir doküman, -1'in geçerli olduğunu söyleyerek açık (bana). Eğer amaç -1 değeri geçersiz ise "0'dan düşük geçersiz" yazmak daha kolay olurdu. Doc ve kod her ikisi de -1 izin verdiğinden, bu Tasarım By olduğunu düşünüyorum, ama bağlanmak için çekinmeyin bir hata (daha rastgele bir SO iplik daha BCL ekibi tarafından işlenmesi olasılığı, sanırım) –