2011-05-05 81 views
8

我遇到了創建連續計時器的麻煩。在定時器上創建的多重交錯線程將運行一段時間,然後完全停止。我允許的最大線程數是5,計時器間隔設置爲10000.因此理論上每2秒執行一個線程。System.Threading.Timer不連續

這發生了一段時間,但它然後停止。目前我正在測試控制檯應用程序並將回覆寫入應用程序。

我並不確切知道所發生的事情在這裏

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(); 
     } 
    } 

這裏任何幫助,不勝感激!乾杯!

+1

你是說線程產卵停止,或線程本身停止? 「一段時間」有多久? – 2011-05-05 18:17:30

+0

Threads itselve,通常他們在進程中停留3分鐘。 – BoredOfBinary 2011-05-05 18:49:09

回答

8

你的計時器在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上打勾。

+0

doh ...我的編譯也在控制檯應用程序中,這也解釋了爲什麼不行呢? – BoredOfBinary 2011-05-05 19:38:09

+0

取決於您的控制檯應用程序是否處於掛起狀態,直到線程完成?如果是這樣,或者至少應該是這樣,那麼爲此使用控制檯應用程序沒有任何問題,只是不要讓主線程(aka,Program.Main)退出。如果確實如此,中國的所有參考資料都不會讓您的計時器保持活躍狀態​​。 – 2011-05-05 19:41:07

+0

感謝您的指導!我如何保持主線程運行? – BoredOfBinary 2011-05-05 19:42:33

0

也許它只是不是在這個代碼snippit,但你有沒有減少counter

+0

哇,一個downvote?爲了什麼?原始的代碼片段只會循環幾次然後退出,這可以解釋爲什麼它在一段時間內工作,然後停止。 – CodingWithSpike 2011-05-05 18:45:36

+0

我的歉意,但我沒有downvote你.. – BoredOfBinary 2011-05-05 18:57:49

+0

如果我這樣做,這是偶然purio – BoredOfBinary 2011-05-05 18:58:27