c#系统.计时器创建大量线程计数-我可以中止线程来修复这个问题吗?
本文关键字:线程 问题 我可以 创建 计时器 系统 | 更新日期: 2023-09-27 18:16:27
我目前正在用c#写一些东西(我以前从未真正使用过),涉及单个定时器System.Timers.Timer
触发7个查询运行对Oracle数据库。它被设计成在服务器上连续和无限期地运行。
在Windows资源监视器中查看运行的进程时,线程数只是在增加。在10秒的间隔内,它在一个小时内达到了230个线程。我想,每次定时器火灾,它创建一个新的线程,但我不能真正找出什么是错的。我假定在任务完成后不必显式地结束线程。
然而,当我在最后一个查询完成工作后添加Thread.CurrentThread.Abort()
时,线程数保持在15。此外,内存使用也大大改善了。
终止线程是正确的吗?感觉很不对,但已经解决了问题。
使用Thread.Abort()当然不是一个正确的解决方案,只是一个隐藏真正问题的权宜之计。您必须找出为什么这些线程不能自己停止运行。
使用调试器执行此操作。Debug + Windows + Threads显示这些线程。选择一个看起来像计时器回调线程的线程,查看它的调用堆栈,看看它在哪里卡住了。最好的方法是同时启用非托管调试和启用Microsoft符号服务器,这样您也可以看到它被卡在不是您编写的代码中。在调用堆栈中找到的DLL的名称通常是一个提示。
参见http://msdn.microsoft.com/en-us/library/0tcs6ww8.aspx
如果SynchronizingObject属性为null,则在ThreadPool线程上引发Elapsed事件。如果Elapsed事件的处理时间长于Interval,则该事件可能会在另一个ThreadPool线程上再次引发。在这种情况下,事件处理程序应该是可重入的。
基本上,这看起来像你的查询没有在给定的时间内完成,或者它锁定了它正在运行的线程。