System.Threading.Timer不连续

时间:2011-05-05 18:15:27

标签: c# multithreading timer

我在创建连续计时器方面遇到了麻烦。在计时器上创建了多个交错的线程,这些线程将运行一段时间然后完全停止。我允许的最大线程数为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();
        }
    }

非常感谢任何帮助!干杯!

2 个答案:

答案 0 :(得分:9)

你的计时器在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。

答案 1 :(得分:0)

也许它只是不在此代码段中,但您是否会减少counter