2009-06-25 364 views
87

有三個Timer類,我所知道的,System.Threading.TimerSystem.Timers.TimerSystem.Windows.Forms.Timer,但這些都沒有一個.Reset()功能,將當前經過的時間重置爲0如何重置C#中的計時器?

是否有有這樣的BCL類功能?有沒有這樣做的黑客方式? (我想也許改變它的時間限制可能會重置它)想想要重新實現具有此功能的Timer類,或者如何使用BCL類之一可靠地實現它,這將是多麼困難?

+3

使用JP的解決方案使用擴展方法 – benPearce 2009-06-25 05:26:58

+0

我也有同樣的需要重置,並提出相同的原因,FileSystemWatcher是不愉快和不方便使用 – 2009-10-29 05:52:03

+0

如果您使用秒錶的定時器和擴展方法答案去,是小心,因爲Stopwatch.Restart擴展方法在.NET 4.0中。 http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.restart(VS.100,lightweight).aspx – si618 2009-11-30 05:15:55

回答

113

我總是這樣......

myTimer.Stop(); 
myTimer.Start(); 

...是一個黑客? :)

每評論,在Threading.Timer,這是Change method ......

duetime參數類型:System.Int32的 的時間調用 之前延遲迴調方法指定 當計時器構建,在 毫秒。指定 Timeout.Infinite以防止重新啓動定時器 。指定零 (0)立即重新啓動計時器。

+0

另一個問題是,只有使用Forms.Timer的人,我的應用程序沒有GUI(沒有參數的Application.Start()),所以我認爲Threading.Timer類更適合其他原因,但好點。 – 2009-06-25 05:27:31

+3

@Matthew:有關各種計時器類的討論,請參閱http://msdn.microsoft.com/en-us/magazine/cc164015.aspx,並在適當的時候使用它們。但是,一般來說,`Forms.Timer`只能與GUI一起使用。但是,除了`Forms.Timer`和`Threading.Timer`之外,還有`Timers.Timer`。 – Brian 2010-06-29 19:25:11

44

除System.Threading.Timer外,所有定時器都具有與Start()和Stop()方法等效的功能。

所以擴展方法,如...

public static void Reset(this Timer timer) 
{ 
    timer.Stop(); 
    timer.Start(); 
} 

...是去了解它的一種方式。

4

你可以寫一個擴展方法稱爲復位(),它

  • 呼籲停止() - 用於Timers.Timer和Forms.Timer開始()
  • 電話更改Threading.Timer
1

重置windows.timer其它替代方式是使用計數器,如下所示:

int tmrCtr = 0; 
Timer mTimer; 

private void ResetTimer() 
{ 
    tmrCtr = 0; 
} 

private void mTimer_Tick() 
{ 
    tmrCtr++; 
    //perform task 
} 

因此,如果您打算每隔1秒重複一次,則可以將計時器間隔設置爲100ms,並將計數器測試爲10個週期。

如果計時器應等待某些進程可能在不同的時間間隔結束,那麼這很合適。

2

對於計時器(System.Windows.Forms.Timer)。

.Stop,然後.Start方法用作重置。

19

對於System.Timers.Timer,根據MSDN文檔,http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx

如果定時器已經啓動之後的時間間隔被設置,所述計數是 復位。例如,如果將間隔設置爲5秒,然後將 的Enabled屬性設置爲true,則計數在Enabled爲 時開始設置。如果在計數爲3秒時將計數間隔重置爲10秒,則 在 啓用設置爲true後,Elapsed事件首次上升13秒。

所以,

const double TIMEOUT = 5000; // milliseconds 

    aTimer = new System.Timers.Timer(TIMEOUT); 
    aTimer.Start();  // timer start running 

    : 
    : 

    aTimer.Interval = TIMEOUT; // restart the timer 
3

我只是分配一個新值定時器:

mytimer.Change(10000, 0); // reset to 10 seconds 

它工作正常,我。

在代碼頂部定義定時器:當System.Threading.Timer myTimer;

if (!active) 
     { 
      myTimer= new System.Threading.Timer(new TimerCallback(TimerProc)); 
     } 
     myTimer.Change(10000, 0); 
     active = true; 

private void TimerProc(object state) 
    { 
     // The state object is the Timer object. 
     System.Threading.Timer t = (System.Threading.Timer)state; 
     t.Dispose(); 
     Console.WriteLine("The timer callback executes."); 
     active = false; 
     //action to do when timer is back to zero 
    } 
0

我這樣做

//Restart the timer 
queueTimer.Enabled = true; 
0

你可以做timer.Interval = timer.Interval

0

爲了清楚起見,因爲一些其他的評論是不正確的,使用System.Timers設置啓用爲真重置已用時間。我只是測試的行爲與下面:

Timer countDown= new Timer(); 

Main() 
{ 
    TextBox.TextDidChange += TextBox_TextDidChange; 
    countdown.Elapsed += CountDown_Elapsed; 
} 

void TextBox_TextDidChange(Object sender, EventArgs e) 
{ 
    countdown.Enabled = true; 
} 

void CountDown_Elapsed(object sender, EventArgs e) 
{ 
    System.Console.WriteLine("Elapsed"); 
} 

我想輸入的文字重複文本框和計時器只會在最後一次按鍵後運行3秒。它也暗示在文檔中,因爲您會看到調用'Timers.Start()'只是將Enabled設置爲true。可以肯定的是,我應該直接從頭開始,你會在.NET reference source中看到,如果啓用一個已啓用的定時器,它將調用專用的UpdateTimer()方法,該方法在內部調用Change( )。