我希望有人可以对我可能发生的事情有所了解.以下是最新动态的摘要.
我有一个应用程序,可以做很多"东西".它是一个非常庞大的应用程序,使用许多线程进行大量的数字运算.有几个定时器使用.在很长一段时间内,计时器停止一直调用已经过的处理程序.
例如:我有一个定时器设置为每秒过去.几个小时后,计时器开始随机触发.如果我没有重新启动应用程序,性能会降低,定时器会稍后启动,最后会变为3或4秒,从而迫使我重新启动应用程序.我无法识别任何泄漏.CPU使用率不会上升,内存不会上升,服务器也不会接近最大值.任何人都可以给我一些关于可能导致这种情况的想法吗?
private void Timer_Elapsed(object source, ElapsedEventArgs e)
{
if (seconds > 0)
{
seconds--;
timer.Start();
}
}
Run Code Online (Sandbox Code Playgroud)
您是否有可能耗尽线程池?大多数计时器使用线程池线程调用处理程序.如果所有线程池线程都在使用中,它将排队,直到有一个可用.
如果是这种情况,请切换一些处理以使用自己的线程,而不是线程池线程.
为了测试你是否正在耗尽线程池,启动一个后台线程,定期(每秒几次)检查ThreadPool.GetAvailableThreads并在可用时很小的情况下记录消息(即使它在你检查时从不实际为零,如果它有时接近零那么这很可能是问题所在.
ThreadPool.SetMaxThreads尽管这可能不是最佳解决方案,但可以更改池的大小.如果您正在使用线程池线程来执行更长时间的运行任务,请将其停止.对于长时间运行的任务,请使用自己的线程.