.NET调度许多操作:单个计时器与一个计时器进行操作



我正在开发一个Windows Service应用程序,在.NET中,该应用程序执行许多函数(这是WCF服务主机(,其中一个目标正在运行计划的任务。

我选择创建一个系统。每次操作结束时,它都会更改dueTime以匹配下一个计划的执行。

大多数操作计划每分钟运行,而不是全部运行,而是延迟了几秒钟。

现在,在添加了大约30个操作后,似乎计时器开始不准确,开始操作迟到了很多秒,甚至迟到了几分钟。

我直接在计时器的回调方法中运行操作逻辑,因此运行线程应与计时器相同。

我应该创建一个任务以运行操作而不是在回调方法中运行它以提高准确性吗?

或我应该使用带有固定(1秒(DUETIME的单个计时器检查需要启动哪些操作?
我不喜欢最后一个选择,因为要处理重新输入会更困难。

计时器在线程池线程上发射,因此您可能会发现,当您添加大量计时器时,您正在用尽线程池。

您可以增加线程池的大小,或者确保比线池大小的计时较少。

从回调中解开任务可能不会有帮助 - 因为您将为同一线程池中的线程而战。除非您使用长期运行的任务。

我们通常设置多个计时器来处理单个服务中的不同操作。我们设置间隔并开始,停止服务开始/停止/关机事件上的计时器(并具有指示每个状态的变量,即Bool停止(当计时器勾选时,我们停止计时器,运行处理(可能需要一段时间,取决于过程,即如果短短时间,则可能需要时间更长。(此代码需要在try-catch中进行 - 因此它继续犯错(处理代码后,我们检查了停止变量,如果不停止,我们再次启动计时器(这可以处理您提到的重新输入,并允许代码尽可能地粘贴在间隔上(据我所知,在大约100毫米后,计时器通常更准确,但应该足够接近您想做的事情。

我们已经运行了这个概念多年了,它没有让我们失望。

如果您将这些任务作为ASP.NET应用程序的子系统运行,则还应该查看可以处理背景处理的HangFire,消除了Windows服务的需求。

计时器需要多么准确?您总是可以使用一个计时器并同时运行多个处理线程?或者如果不太关键的话,将通话排队到某些操作。

好吧,我做出了决定:由于我无法轻松地重现行为,所以我选择解决根问题并使用服务过程仅限:

  1. 服务客户完成的服务WCF请求
  2. 计划操作(这是有问题的(

每个可以食用CPU的操作都是由另一个过程执行的,该过程直接由主过程(使用System.Diagnostics. -Process及其事件(控制,并通过WCF与它进行通信。

当我启动次要过程时,我通过命令行传递了主过程的pid。如果后者被杀死,则该过程进行了大火,我也可以关闭子程序。

这样,主服务通常不会使用太多的CPU时间,并且可以在没有延迟的情况下自由安排。

感谢所有给我一些建议的人!

最新更新