c# - 计时器延迟随着时间的推移而退化或变得不一致?

标签 c# .net timer

我希望有人能够阐明我可能会发生的事情。以下是所发生事件的摘要。

我有一个可以做很多“事情”的应用程序。它是一个相当庞大的应用程序,使用许多线程进行大量的数字运算。使用了多个计时器。在很长一段时间内,计时器会持续停止调用已用处理程序。

例如:我有一个计时器设置为每秒流逝一次。一段时间后,计时器开始随机延迟触发。如果我不重新启动应用程序,性能就会下降,并且计时器会越来越晚地触发,最终变成 3 或 4 秒,迫使我重新启动应用程序。我无法识别任何泄漏。 CPU 使用率没有上升,内存也没有上升,服务器也远未达到极限。谁能给我一些关于可能导致此问题的想法?

private void Timer_Elapsed(object source, ElapsedEventArgs e)
{
    if (seconds > 0)
    {
        seconds--;

        timer.Start();
    }
}

最佳答案

是否有可能耗尽线程池?大多数计时器使用线程池线程调用处理程序。如果所有线程池线程都在使用中,它将排队直到有一个线程可用。

如果是这种情况,请将某些处理切换为使用您自己的线程,而不是线程池线程。

要测试线程池是否耗尽,请启动一个后台线程,该线程会定期(每秒几次)检查 ThreadPool.GetAvailableThreads并在可用值很小时记录一条消息(即使在检查时它实际上从未为零,如果它有时接近零,那么很可能这就是问题所在)。

可以使用 ThreadPool.SetMaxThreads 更改池的大小尽管这可能不是最好的解决方案。如果您将线程池线程用于运行时间较长的任务,请停止它。对于长时间运行的任务,请使用您自己的线程。

关于c# - 计时器延迟随着时间的推移而退化或变得不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3526944/

相关文章:

c# - 在 C# 中为 Print Spooler API 设置标志?

.net - 在 RichTextBox 中隐藏超链接 URL(Windows 窗体)

c# - 迭代集合并删除我不想要的集合

java - 在 Java 中最推荐使用计时器的方法是什么

javascript - 使用 Javascript PHP MySQL 的在线考试计时器

c# - 在 gridview 中绑定(bind)标签文本

c# - 无法在 Windows 运行时组件库中的 UserControl 中创建依赖属性

swift - 在 Swift 中更改定时器选择器函数中的 userInfo

c# - 将 PostBackTrigger 和 AsyncPostBackTriggers 添加到 UpdatePanel 以使用 checkChanged EventHandler 动态生成复选框

c# - 从动态创建的文本框加载值,ASPx