我试图创建一个派生类的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;
}
}
正是我看到的问题。底线:不要设置时间间隔,否则计时器将会启动。 –