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

时间:2015-06-04 13:53:05

标签: 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);

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

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

1 个答案:

答案 0 :(得分:5)

如果你没有保持对它的引用,那么

<?php if ( function_exists( 'get_avatar' ) ) { echo get_avatar( $user->user_email, 50); } else { //alternate gravatar code for < 2.5 $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id= " . md5($user->user_email) . "&default=" . urlencode($default) . "&size=" . $size; echo "<img src='$grav_url' height='50px' width='50px' />"; } ?> 可以被垃圾收集。在大约10条消息之后,GC似乎会启动并终止您的计时器。

切换到不会像System.Threading.Timer那样收集垃圾的其他计时器,或保留对计时器的某种引用,而不是让变量超出范围,程序应该可以正常工作。

请参阅this SO question,详细了解System.Timers.Timer为什么会在GC中生存,但System.Timers.Timer不会。