我想构建一个继承自System.Timers.Timer的计时器类。
如此
Class MyTimer : System.Timers.Timer
{
public bool IsRunning{ get; set;}
}
并且当它过去时旗帜将为真,并且当线程结束时,该谬误将再次为假。任何的想法 ?
答案 0 :(得分:2)
为什么不使用Enabled属性?
如果定时器不是AutoReset定时器(即它只会触发一次),那么如果Timer.Enabled为真,则定时器IS正在运行。当计时器过去并触发Elapsed事件时,Timer.Enabled将不再为真。
如果定时器是一个AutoReset定时器(即每次间隔过去它都会触发),那么如果Timer.Enabled为真,则定时器IS正在运行。
我不确定您所提议的IsRunning属性所需的额外功能是否已通过Enabled属性提供。
请参阅System.Timers.Timer文档。
如果您想要一个能告诉您Elapsed事件当前是否正在运行的计时器,那么您可以这样做:
public class MyTimer : System.Timers.Timer
{
ElapsedEventHandler elapsed;
public bool IsElapsedEventRunning { get; set; }
//
// Accept the ElapsedEventHandler in the constructor since the Elapsed property
// is not virtual so it cannot be overridden.
//
public MyTimer(double interval, ElapsedEventHandler elapsed)
{
IsElapsedEventRunning = false;
this.Interval = interval;
// Save the ElapsedEventHandler
this.elapsed = elapsed;
// Set the base Timer's Elapsed event property to MY OWN ElapsedEventHandler
Elapsed += new ElapsedEventHandler(MyTimer_Elapsed);
}
//
// When base timer fires Elapsed event, my ElapsedEventHandler will be called.
// Inside, set IsElapsedEventRunning = true, then call the user's event handler.
// When finished, set IsElapsedEventRunning = false
//
void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
{
//
// Warning! Not thread safe! Not reentrant!
//
System.Diagnostics.Debug.WriteLine("MyTimer.IsElapsedEventRunning = {0}", IsElapsedEventRunning);
IsElapsedEventRunning = true;
// Is Invoke ok here or is BeginInvoke/EndInvoke required?
elapsed.Invoke(sender, e);
IsElapsedEventRunning = false;
System.Diagnostics.Debug.WriteLine("MyTimer.IsElapsedEventRunning = {0}", IsElapsedEventRunning);
}
}
请注意,ElapsedEventHandler(MyTimer_Elapsed)不是很强大(例如甚至不考虑重入)。如果Elapsed事件的处理时间比Interval要长,则Elapsed事件将再次触发。
Timer文档中有一些示例说明如何实现更强大的ElapsedEventHandler。这些信息可能适用于此。
说完这一切后,这似乎不是一个好主意。我的猜测是,这将难以正确可靠地工作。