我試圖創建一個派生類的Timer,它允許設置一個'Pause'閂鎖以防止工作線程重新激活定時器。但是,當AutoReset設置爲false並且Enabled訪問器似乎正在執行阻止在設置Paused變量時修改基類的Enabled屬性的工作時,Elapsed事件繼續發生。當Enabled設置爲false時,爲什麼System.Timer.Timer仍然觸發事件?
爲什麼會發生這種情況,或者應該使用什麼策略來進一步瞭解這裏實際發生的交互?
我附上了下面派生類的實現。
using System.Timers
class PauseableTimer : Timer
{
public bool Paused;
new public bool Enabled
{
get
{
return base.Enabled;
}
set
{
if (Paused)
{
if (!value) base.Enabled = false;
}
else
{
base.Enabled = value;
}
}
}
}
舉例說明問題。
class Program
{
private static PauseableTimer _pauseableTimer;
private static int _elapsedCount;
static void Main(string[] args)
{
_pauseableTimer = new PauseableTimer(){AutoReset = false,Enabled = false,Paused = false};
_pauseableTimer.Elapsed += pauseableTimer_Elapsed;
_pauseableTimer.Interval = 1;
_pauseableTimer.Enabled = true;
while(_elapsedCount<100)
{
if (_elapsedCount > 50) _pauseableTimer.Paused = true;
}
}
static void pauseableTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine(String.Format("this.Enabled:'{0}',Paused:'{1}',AutoReset:'{2}",_pauseableTimer.Enabled,_pauseableTimer.Paused,_pauseableTimer.AutoReset));
_elapsedCount++;
_pauseableTimer.Interval = _pauseableTimer.Interval == 1 ? 2 : 1; //This line breaks it.
_pauseableTimer.Enabled = true;
}
}
正是我看到的問題。底線:不要設置時間間隔,否則計時器將會啓動。 –