我在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);
还有什么可能是我的问题? 我相信已经正确锁定了所有线程共享资源,甚至仔细记录了锁定区域的所有进出 - >所以我看不到任何僵局。
如何在这种情况下检测到死锁?
答案 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
不会。