Windows 服务中的计时器 .. 这个规模可以吗?会不会出现线程问题?这是不好的做法吗?

Posted

技术标签:

【中文标题】Windows 服务中的计时器 .. 这个规模可以吗?会不会出现线程问题?这是不好的做法吗?【英文标题】:Timer in Windows Service .. Will this scale OK? Will threading issues occur? Is this bad practice? 【发布时间】:2019-08-12 13:01:08 【问题描述】:

我很想知道我应该对这种方法有什么顾虑。该代码将检查 SQL 表以查找要执行的预定工作,并且我将更改计时器以在工作完成之前不执行任何操作。 SQL 触发器是一个可行的选择吗? Windows 计划中的控制台应用程序呢?


protected override void OnStart(string[] args) 
   this.workChecker = new Timer(new TimerCallback(DoWork), null, 0, 60*10*1000); // 10 minutes
   Thread.Sleep(Timeout.Infinite);

【问题讨论】:

您有任何特殊问题吗? Stack Overflow 不是讨论区。 是的。我根据您的评论修改了我的问题,但是我相信我已经在这里阅读讨论已有十多年了。我想是时候得到一些“代表”了。谢谢 【参考方案1】:

您不应该屏蔽OnStart,因此不需要Thread.Sleep(Timeout.Infinite);。计时器选项可能有效,但正如您所见,存在一些可重入问题(您应该确保新作业在前一个工作时不会开始,以避免出现竞争条件)。我建议检查 Quartz.NET 库,它可以解决此类问题,并且具有许多其他用于计划作业的功能。

【讨论】:

太棒了.. 非常感谢.. 我肯定会检查 Quartz。我阻止了线程,因为没有它计时器将停止执行。我现在正在将代码移动到实例对象,也许我可以/应该为此生成一个线程..? 如果交互(用于调试等),我在没有服务基础的情况下运行,这就是为什么线程在没有一些 OnStop 信号的情况下完成,因此手动线程休眠。再次感谢!

以上是关于Windows 服务中的计时器 .. 这个规模可以吗?会不会出现线程问题?这是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

具有长时间运行任务的单独线程中的计时器

在 Windows 服务上调用公共方法

在 Windows 服务中从事件处理程序启动计时器

C# 无法创建将启动的 Windows 服务

Windows 中的可等待计时器问题(timeSetEvent 和 CreateTimerQueueTimer)

c#计时器如何保存计时