一個測試用小程序中用了兩個timer控件(System.Windows.Forms.Timer)來執行定時任務。其中一個定時器timerA在異步獲取到資源后會在這個異步的task(System.Threading.Tasks )中啟動執行。日志打印中發現所有的啟動條件都滿足,但是無論如何都看不到此task執行。
於是翻了翻MSDN,微軟對這個控件的定義如下:實現按用戶定義的時間間隔引發事件的計時器。 此計時器最宜用於 Windows 窗體應用程序中,並且必須在窗口中使用。(出處)。也就意味着,如果不是UI線程的話,定時器可能是不會被執行的。
解決辦法也就出來了:使用System.Timers命名空間下的Timer。
微軟的描述:
Windows 窗體計時器組件是單線程的,且限制為55毫秒的准確度。 如果需要具有更高准確性的多線程計時器,請使用 Timer 命名空間中的類 System.Timers 。
從上述描述中可以看出,不僅timer控件(System.Windows.Forms.Timer)只能在窗口中使用,而且精度也不能保證,只能用來執行簡單的任務。
改為 System.Timers 的timer后,程序運行正常。