Dot-Net
為什麼 Task.Delay() 允許無限延遲?
在我的應用程序凍結後,我追踪了一個執行緒等待由
Task.Delay()(或TaskEx.Delay()在 .NET 4.0 中)創建的任務的原因,它為其提供了一個計算TimeSpan,由於錯誤,有時計算為 aTimeSpan小於TotalMilliseconds或等於-1和大於-2(即介於 -10000 到 -19999 個刻度之間的任意位置,包括端點)。看來,當您傳遞一個毫秒或更低的負數時,該
TimeSpan方法正確地-2拋出一個表示無窮大)。這意味著該任務上設置的任何延續將永遠不會執行,並且發生在該任務上的任何不良執行緒將永遠被阻止。ArgumentOutOfRangeException``Task``System.Threading.Timer``dueTime``.Wait()``Task
Task一個永遠不會完成的東西有什麼可能的用途?有人會期望這樣的返回值嗎?傳遞給 的任何負值.Delay()(包括該特殊範圍內的值)不應該拋出一個ArgumentOutOfRangeException?
Timeout.Infinite或 -1 在您想無限期地等待一個長時間執行的任務時很有用,該任務將花費不確定的時間來完成,但最終會完成。
Win32 API 還使用常量 INFINITE = -1 來表示無限超時。
您通常不想在 UI 執行緒中使用它,因為它可能會凍結 UI(這似乎是您的問題)。但是在工作執行緒中有一些有效的案例——例如,伺服器阻塞等待來自客戶端的連接。
當我希望控制台應用程序不終止時,我正在使用它。例如,當我為 Azure 編寫Web 作業時,我需要一個永不終止的程序。這是模板:
public async Task Main(string args[]) { var timer = new Timer(); timer.Interval = 6000; timer.Elapsed += (sender, args) => { // Do something repeatedly, each 1 minute. }; timer.Start(); // Now what to do to stop the application from terminating!? // That's the magic: await Task.Delay(-1); }