一个测试用小程序中用了两个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后,程序运行正常。