2015-06-04 78 views
1

我在C#.NET 3.5中。 看来,通过从同一个线程注册超过10个System.Threading.Timers导致第一个以某种方式消失... 虽然不能相信它。如果那是真的,我会更加震惊。可以从一个线程使用System.Threading.Timer启动多少个线程(定时器)?

这里是行,我在那里启动一个定时器,每次有新邮件到达时:

System.Threading.Timer tmr = new System.Threading.Timer(WaitAckElapsedTmrHandler, msgId, Constants.TIME_TO_WAIT_FOR_ACK, Timeout.Infinite); 

还有什么可能是我的问题吗? 我相信已经正确地锁定了所有的线程共享资源,甚至仔细记录了所有进/出锁区域 - >所以我看不到任何死锁。

如何在这种情况下检测到死锁?

+3

情况并非如此。创建多个'Timer'对象不会破坏较早的对象。 – Servy

回答

5

System.Threading.Timer如果您没有保存活着的引用,可以进行垃圾回收。在大约10条消息之后,GC似乎会启动并杀死你的计时器。

切换到另一个不会像System.Timers.Timer那样得到垃圾回收的定时器,或者保留对定时器的某种引用,而不是让变量超出范围并且程序应该工作。

请参阅this SO question了解更多关于为什么System.Timers.Timer能够存活GC的原因,但System.Threading.Timer不会。

+0

哇!这是一个好点...我甚至没有想过GC,因为我来自C++:P –

+0

这确实有帮助!再次感谢! –

相关问题