计时器延迟是随着时间的推移而降低还是变得不一致?
我希望有人能够对我可能发生的事情有所了解。 以下是最新情况的总结。
我有一个应用程序可以处理很多“东西”。 它是一个非常庞大的应用程序,使用许多线程进行大量的数字运算。 有几个定时器被使用。 在很长一段时间内,定时器会一直停止调用已过时的处理程序。
例如:我有一个计时器设置为每秒过去一次。 几个小时后,计时器开始随机触发很晚。 如果我不重新启动应用程序,性能会降低,定时器会稍后启动,最终会变成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?