問題:
在windows service程式中,定時器在運行一段時間後不工作
分析:
在查閱了大量的資料後,我們發現導致這個錯誤的原因是因為.NET Framework中System.Timers.Timer的bug導致的。以下是該BUG的簡單資訊:
BUG: The Elapsed event of the System.Timers.Timer class is not raised in a Windows service
Article ID |
: |
KB 842793 |
Last Review |
: |
July 27, 2004 |
Revision |
: |
1.0 |
SYMPTOMS
You can use the Microsoft .NET Framework to create a new Microsoft Windows service that contains a System.Timers.Timer object. When you run this new Windows service, the Elapsed event of the System.Timers.Timer class may not be raised.
CAUSE
Note In this section, the System.Timers.Timer object is referred to as the Timer object.
In the event handler for the Elapsed event of the Timer object, if you call the Stop method of the Timer object, the reference to the Timer object is lost. The garbage collector then reclaims the memory that is associated with the Timer object. Later, even if you call the Start method of the Timer object to raise the Elapsed event, the call does not work. The Elapsed event is not raised.
WORKAROUND
To work around this problem, use a System.Threading.Timer object instead of the System.Timers.Timer object.
STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed in the "Applies to" section.
詳見以下連結內容,http://support.microsoft.com/default.aspx?scid=kb;EN-US;842793 。
解決方案:
按照KB 842793的建議,用System.Threading.Timer替換System.Timers.Timer。