计时器延迟是随着时间的推移而降低还是变得不一致?

我希望有人能够对我可能发生的事情有所了解。 以下是最新情况的总结。

我有一个应用程序可以处理很多“东西”。 它是一个非常庞大的应用程序,使用许多线程进行大量的数字运算。 有几个定时器被使用。 在很长一段时间内,定时器会一直停止调用已过时的处理程序。

例如:我有一个计时器设置为每秒过去一次。 几个小时后,计时器开始随机触发很晚。 如果我不重新启动应用程序,性能会降低,定时器会稍后启动,最终会变成3或4秒钟,迫使我重新启动应用程序。 我一直无法识别任何泄漏。 CPU使用率没有增加,内存不上,服务器没有接近最大的地方。 任何人都可以给我一些想法,可能是什么原因造成的?

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

        timer.Start();
    }
}

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

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

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

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


你使用的定时器类非常重要

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

但我不认为问题是计时器本身,例如尝试使用相同的计时器类来创建应用程序

仅将当前日期时间写入日志文件

并让它运行很长一段时间,你会发现没有这样的3/4秒延迟

检查您的计时器代码并检查是否没有共享资源被同时访问,也许定时器是好的,但是事件处理函数或函数使用的“某些东西”存在瓶颈


听起来好像它可能不是同一个计时器,所以这里“泄漏”的资源是GDI句柄。

链接地址: http://www.djcxy.com/p/57477.html

上一篇: Timer Delay Degrades or becomes inconsistent over time?

下一篇: How do you use multiple versions of the same R package?