2015-06-04 76 views
1

我在C#.NET 3.5中。 看來,通過從同一個線程註冊超過10個System.Threading.Timers導致第一個以某種方式消失... 雖然不能相信它。如果那是真的,我會更加震驚。可以從一個線程使用System.Threading.Timer啓動多少個線程(定時器)?

這裏是行,我在那裏啓動一個定時器,每次有新郵件到達時:

System.Threading.Timer tmr = new System.Threading.Timer(WaitAckElapsedTmrHandler, msgId, Constants.TIME_TO_WAIT_FOR_ACK, Timeout.Infinite); 

還有什麼可能是我的問題嗎? 我相信已經正確地鎖定了所有的線程共享資源,甚至仔細記錄了所有進/出鎖區域 - >所以我看不到任何死鎖。

如何在這種情況下檢測到死鎖?

+3

情況並非如此。創建多個'Timer'對象不會破壞較早的對象。 – Servy

回答

5

System.Threading.Timer如果您沒有保存活着的引用,可以進行垃圾回收。在大約10條消息之後,GC似乎會啓動並殺死你的計時器。

切換到另一個不會像System.Timers.Timer那樣得到垃圾回收的定時器,或者保留對定時器的某種引用,而不是讓變量超出範圍並且程序應該工作。

請參閱this SO question瞭解更多關於爲什麼System.Timers.Timer能夠存活GC的原因,但System.Threading.Timer不會。

+0

哇!這是一個好點...我甚至沒有想過GC,因爲我來自C++:P –

+0

這確實有幫助!再次感謝! –

相關問題