当 CPU 利用率和内存增加时,计时器间隔增加

Posted

技术标签:

【中文标题】当 CPU 利用率和内存增加时,计时器间隔增加【英文标题】:Timer Interval Increases when CPU utilization and memory increases 【发布时间】:2019-08-10 21:41:02 【问题描述】:

我的代码中有一个计时器,时间为“x”秒。该代码有多个线程,并且有多个计时器。现在我注意到,我的应用程序在运行一段时间后进入挂起状态,从日志中我注意到计时器间隔发生变化。它增加了。这怎么可能,任何人都可以为此提供解决方案吗? c#中的计时器是否有任何替代方法

      _timernew = new System.Timers.Timer(10000)
            
                AutoReset = false
            ;
            _timernew .Elapsed += (sender, e) =>  DoSomething ;
            _timernew .Enabled = true;

【问题讨论】:

请添加一些源代码进行调查 如果没有任何源代码或重现问题的示例,我们将无法帮助您。 想象一下,你每 5 秒就有一项重要工作要做,这需要 1 秒。易于管理。现在你必须处理 6 个这样重要的工作 -> 容易及时处理吗? C# 中至少有 5 个计时器类。你用的是哪一个? 您的问题仍然太缺乏细节。缩小并告诉我们计时器的用途。 【参考方案1】:

计时器不精确。间隔是触发事件之前的最小延迟,但不能保证您的计时器事件会在间隔结束时准确执行。

当间隔过去时,计时器将您的偶数处理程序排入线程池。因此,当线程池中有可用线程来获取处理程序时,事件处理程序将被执行,然后有可用的 CPU 内核来实际执行它。

换句话说,计算机越忙,延迟发生的可能性就越大。

如果您需要更接近实时的执行,则必须使用专用线程并将其优先级设置为高:

Thread myThread = new Thread(MyThreadMethod);
myThread.Priority = ThreadPriority.Highest;
myThread.Start();

然而,现在,在您的 MyThreadMethod 中,您需要实现一个复杂的机制来监控已经过去了多少时间并决定您是否必须执行您的实际代码。

您不应该只是循环并检查时间,因为这将占用 100% 的单个内核。也许您可以使用更小的间隔使用可怕的Thread.Sleep 并检查时间是否已经过去。您必须使用比您需要的间隔更小的间隔,幅度至少为 10。Thread.Sleep 也不精确。

【讨论】:

以上是关于当 CPU 利用率和内存增加时,计时器间隔增加的主要内容,如果未能解决你的问题,请参考以下文章

给NIOS II CPU增加看门狗定时器并使用

Windows 服务增加 CPU 消耗

Lua/Corona SDK:为啥我的倒计时停止了?

无法在异步间隔中清除计时器

GAMEMAKER 2.o 按下按钮后增加计时器

[Unity计时器倒计时,当应用杀死Android时不起作用