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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐