我正在编写一个 Windows 服务,它每隔一定时间运行一个可变长度的事件(数据库扫描和更新)。我需要此任务频繁运行,但要处理的代码并发运行多次并不安全。
我怎样才能最简单地设置一个计时器,使其每 30 秒运行一次任务,同时从不重叠执行? (我假设 System.Threading.Timer
是这项工作的正确计时器,但可能是错误的)。
最佳答案
您可以使用计时器来完成,但您需要对数据库扫描和更新进行某种形式的锁定。一个简单的 lock
同步可能足以防止多次运行的发生。
也就是说,在您的操作完成后启动一个计时器可能会更好,并且只使用它一次,然后停止它。下次操作后重新启动它。这将使您在事件之间有 30 秒(或 N 秒),没有重叠的机会,也没有锁定。
示例:
System.Threading.Timer timer = null;
timer = new System.Threading.Timer((g) =>
{
Console.WriteLine(1); //do whatever
timer.Change(5000, Timeout.Infinite);
}, null, 0, Timeout.Infinite);
立即工作......完成......等待 5 秒......立即工作......完成......等待 5 秒......
关于c# - 同步定时器以防止重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684200/