C# Windows服务中周期函数超时如何暂停Timer避免并行执行?
问题解答
定时器超时后的默认行为
默认情况下,System.Timers.Timer的AutoReset属性为true,到达35ms周期就会触发Elapsed事件,完全不会等待上一次的periodic_function()执行完毕。由于事件处理逻辑是在ThreadPool线程上运行的,所以确实会出现多个periodic_function()实例并行执行的情况,极易引发数据冲突或资源竞争问题。
解决方案:手动控制定时器启停
要实现「函数执行时暂停定时器,完成后重启并重新计算35ms间隔」的需求,只需在事件处理函数开头停止定时器,执行完业务逻辑后再重启即可。同时必须用try...finally块包裹,确保即使业务函数抛出异常,定时器也能恢复运行,避免服务陷入停滞。
修改后的代码如下:
System.Timers.Timer timer4 = new System.Timers.Timer(); public void InitializeTimer_4_Measuring_period() { timer4.Elapsed += OnTimedEvent_Measuring_period; timer4.Interval = 35; } public void OnTimedEvent_Measuring_period(object sender, EventArgs e) { // 立即停止定时器,防止重复触发 timer4.Stop(); try { periodic_function(); } finally { // 无论函数执行成功/失败,都重启定时器,从当前时刻开始计算下一个35ms间隔 timer4.Start(); } }
额外说明
- 这种方式下,每次
periodic_function()的执行都会独占定时器资源,直到执行完成才会启动下一个周期,彻底避免了并行执行的问题。 - 如果
periodic_function()涉及共享资源访问,建议在函数内部添加线程安全控制(比如使用lock),进一步避免并发问题。
内容的提问来源于stack exchange,提问作者Dargento
相关产品推荐
相关产品推荐

