【问题标题】:Timer - don't rerun until previous one complete计时器 - 在前一个完成之前不要重新运行
【发布时间】:2014-09-28 13:34:22
【问题描述】:

我有一个Timer,我每 10 秒运行一次,以将我的应用程序中的本地数据同步回我们的服务器。

public Timer syncTimer;
syncTimer = new Timer((o) =>
    { 
        this.syncToServer();

    }, null, 0, 10000);

我有一个问题,如果我的 syncToServer 执行时间超过 10 秒,它会自行跳闸。我正在考虑执行以下操作以在计时器执行时暂停计时器,然后在完成后重新启动:

public Timer syncTimer;
syncTimer = new Timer((o) =>
    { 
        syncTimer.Change(Timeout.Infinite , Timeout.Infinite); //Stop the timer
        this.syncToServer();
        syncTimer.Change(10000 , 10000); //Restart the timer
    }, null, 0, 10000);

这是实现我所追求的最佳方式还是有更好的方式来阻止它同时执行?

【问题讨论】:

  • 设置一个布尔标志怎么样?如果它现在正在执行(所以boolean 为真,只需跳过一次执行并在 10 秒内等待下一次执行?
  • 为此使用 lock

标签: c# timer


【解决方案1】:

也许你可以使用 System.Timers.Timer,它比 System.Threading.Timer 更容易理解。

var timer = new System.Timers.Timer(1000);
timer.AutoReset = false;
timer.Elapsed += (sender, e) => {
    this.syncToServer();
    // maybe Thread.Sleep(100000);
    timer.Start();
};
timer.Start();

愿它有所帮助。

【讨论】:

  • 这个答案的好处是定时器只有在任务执行完成后才会重新启动,所以用这个方案根本不可能重入。
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 2020-12-05
  • 2017-12-18
  • 2017-01-14
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多