我可以从一个线程使用 System.Threading.Timer 启动多少个线程(计时器)?
How many threads (timers) can I launch using System.Threading.Timer from one thread?
我正在使用 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);
我还有什么问题?
我相信已正确锁定所有线程共享资源,甚至仔细记录所有进出 to/from 锁定区域 -> 所以我看不到任何死锁。
在这种情况下如何检测死锁?
System.Threading.Timer
如果您不保留对它的引用,则可以进行垃圾回收。大约 10 条消息后,GC 似乎启动并终止了您的计时器。
切换到另一个不会像 System.Timers.Timer
那样进行垃圾收集的计时器,或者保留对计时器的某种引用,而不是让变量超出范围,程序应该可以运行。
请参阅 this SO question 以更深入地解释为什么 System.Timers.Timer
会在 GC 中幸存下来而 System.Threading.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);
我还有什么问题? 我相信已正确锁定所有线程共享资源,甚至仔细记录所有进出 to/from 锁定区域 -> 所以我看不到任何死锁。
在这种情况下如何检测死锁?
System.Threading.Timer
如果您不保留对它的引用,则可以进行垃圾回收。大约 10 条消息后,GC 似乎启动并终止了您的计时器。
切换到另一个不会像 System.Timers.Timer
那样进行垃圾收集的计时器,或者保留对计时器的某种引用,而不是让变量超出范围,程序应该可以运行。
请参阅 this SO question 以更深入地解释为什么 System.Timers.Timer
会在 GC 中幸存下来而 System.Threading.Timer
不会。