-1

我目前正在用 C#(我以前从未真正使用过)编写一些东西,其中涉及一个计时器System.Timers.Timer 触发 7 个针对 Oracle 数据库运行的查询。它被设计为在服务器上连续且无限期地运行。

查看 Windows 资源监视器中运行的进程时,线程数正在增加。每隔 10 秒,不到一个小时就达到了 230 个线程。我猜每次计时器触发时,它都会创建一个新线程,但我无法真正找出问题所在。我假设我不必在任务完成后显式结束线程。

但是,当我Thread.CurrentThread.Abort()在最后一个查询完成工作后添加一个时,线程数保持在 15。此外,内存使用情况也好很多。

中止线程是正确的做法吗?感觉很不对劲,但它已经解决了问题。

4

2 回答 2

1

使用 Thread.Abort() 当然不是一个正确的解决方法,只是一个隐藏真正问题的创可贴。您必须找出为什么这些线程不会自行停止运行。

通过使用调试器来做到这一点。Debug + Windows + Threads 显示这些线程。选择一个看起来像计时器回调线程的线程并查看它的调用堆栈,看看它卡在哪里。最好还启用非托管调试并启用 Microsoft 符号服务器,这样您也可以看到它卡在您未编写的代码中。您在调用堆栈中找到的 DLL 名称通常是一个提示。

于 2013-05-31T13:48:40.173 回答
-1

请参阅http://msdn.microsoft.com/en-us/library/0tcs6ww8.aspx上的备注

如果 SynchronizingObject 属性为 null,则在 ThreadPool 线程上引发 Elapsed 事件。如果 Elapsed 事件的处理持续时间超过 Interval,则该事件可能会在另一个 ThreadPool 线程上再次引发。在这种情况下,事件处理程序应该是可重入的。

基本上这看起来你的查询要么没有在给定的时间内完成,要么它锁定了它正在运行的线程。

于 2013-05-31T12:57:18.497 回答