构建具有标记的MyTimer

时间:2010-11-16 18:27:42

标签: c# timer

我想构建一个继承自System.Timers.Timer的计时器类。

如此


Class MyTimer : System.Timers.Timer
{
   public bool IsRunning{ get; set;}
}

并且当它过去时旗帜将为真,并且当线程结束时,该谬误将再次为假。任何的想法 ?

1 个答案:

答案 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。这些信息可能适用于此。

说完这一切后,这似乎不是一个好主意。我的猜测是,这将难以正确可靠地工作。