我可以从一个线程使用System.Threading.Timer启动多少个线程(定时器)?

Sol*_*Out 1 c# multithreading timer

我在C#.NET 3.5中.看来,通过从同一个线程注册超过10个System.Threading.Timers会导致第一个以某种方式死掉......但不能相信它.如果这是真的,我会感到震惊.

这是我每次收到新消息时启动计时器的行:

System.Threading.Timer tmr = new System.Threading.Timer(WaitAckElapsedTmrHandler, msgId, Constants.TIME_TO_WAIT_FOR_ACK, Timeout.Infinite);
Run Code Online (Sandbox Code Playgroud)

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

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

Sco*_*ain 5

System.Threading.Timer如果你没有保持对它的引用,可以进行垃圾收集.在大约10条消息之后,GC似乎会启动并终止您的计时器.

切换到不收集垃圾的不同计时器System.Timers.Timer或保留对计时器的某种引用,而不是让变量超出范围,程序应该工作.

请参阅此SO问题,以获得更深入的解释,了解为什么System.Timers.Timer能够在GC中存活但System.Threading.Timer不会.