You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:33:23