[英]System.Threading.Timer not continuous
我在创建连续计时器时遇到了麻烦。 在计时器上创建了多个交错的线程,这些线程将运行一段时间然后完全停止。 我允许的最大线程数为5,定时器间隔设置为10000.因此理论上每2秒执行1个线程。
这种情况会发生一段时间,但随后会停止。 目前我正在测试控制台应用程序并将响应写入应用程序。
我不确定这里发生了什么
internal class EngineThreadGenerator
{
private readonly AutoResetEvent _autoEvent;
private readonly Action<string, string> _processQueueDelegate;
private readonly Action<string, string> _purgeQueueDelegate;
private void createAllowedEmailThreads()
{
for (int counter = 0; counter < AppSettings.ProcessQueueAllowedThreads; counter++)
{
EmailThread _emailThread = new EmailThread(_collection, _processQueueDelegate, _purgeQueueDelegate);
TimerCallback _timerCallback = _emailThread.InitEmailThread;
Timer _stateTimer = new Timer(_timerCallback, _autoEvent, 0, AppSettings.ProcessIntervalInMilliseconds);
pauseLoop();
}
}
非常感谢任何帮助! 干杯!
定时器在3分钟后死亡的原因是你有很多可用的内存。
这意味着垃圾收集器在收集它们之前大约需要3分钟才能找到它们。
您应该在其生命周期内保留对计时器的引用。 由于您没有这样做,因此只要您的循环结束,计时器就有资格进行垃圾回收。
3分钟后,或者当GC到达它时,收集计时器,并且代码停止执行。
所以,保持对计时器对象的引用,你应该全部设置。
这是一个简单的LINQPad脚本,用于测试:
void Main()
{
new Timer(Callback, null, 0, 1000);
Thread.Sleep(5000);
Debug.WriteLine("collecting");
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Debug.WriteLine("collected");
Thread.Sleep(5000);
}
static void Callback(object state)
{
Debug.WriteLine("callback");
}
观察一旦主线程运行GC,回调就会停止。 另一方面,如果您将计时器的副本复制到字段中:
Timer _Timer;
void Main()
{
_Timer = new Timer(Callback, null, 0, 1000);
...
计时器继续通过GC。
也许它只是不是在这个代码snippit,但你有没有减少counter
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.