c# - 同步定时器以防止重叠

标签 c# multithreading timer overlap

我正在编写一个 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/

相关文章:

JavaScript 双重空检查和锁定

c++ - 如何使用 POSIX 线程实现阻塞读取

ios - Swift 计数停止在错误的数字

c# - 当 'object' 的某个字段可以有多种类型时,如何访问它而不将其转换为一种类型?

c# - 从 Powershell 获取 Azure Active Directory 访问 token

c# - 如何通过将 dll 导入引用来在 C#.net for winforms 的工具箱中添加用户控件?

java - 将两个 numberPicker 值小时和分钟组合成一个倒数计时器

c# - 如何检索超过 25 条记录的 YouTube 用户播放列表列表。 YouTube API v2,C#

JavaFX TextArea 立即更新

java - 将列名更改为其他时,TableView提供错误