有三個Timer
類,我所知道的,System.Threading.Timer
,System.Timers.Timer
和System.Windows.Forms.Timer
,但這些都沒有一個.Reset()
功能,將當前經過的時間重置爲0如何重置C#中的計時器?
是否有有這樣的BCL類功能?有沒有這樣做的黑客方式? (我想也許改變它的時間限制可能會重置它)想想要重新實現具有此功能的Timer
類,或者如何使用BCL類之一可靠地實現它,這將是多麼困難?
有三個Timer
類,我所知道的,System.Threading.Timer
,System.Timers.Timer
和System.Windows.Forms.Timer
,但這些都沒有一個.Reset()
功能,將當前經過的時間重置爲0如何重置C#中的計時器?
是否有有這樣的BCL類功能?有沒有這樣做的黑客方式? (我想也許改變它的時間限制可能會重置它)想想要重新實現具有此功能的Timer
類,或者如何使用BCL類之一可靠地實現它,這將是多麼困難?
我總是這樣......
myTimer.Stop();
myTimer.Start();
...是一個黑客? :)
每評論,在Threading.Timer,這是Change method ......
duetime參數類型:
System.Int32
的 的時間調用 之前延遲迴調方法指定 當計時器構建,在 毫秒。指定Timeout.Infinite
以防止重新啓動定時器 。指定零 (0)立即重新啓動計時器。
另一個問題是,只有使用Forms.Timer的人,我的應用程序沒有GUI(沒有參數的Application.Start()),所以我認爲Threading.Timer類更適合其他原因,但好點。 – 2009-06-25 05:27:31
@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
除System.Threading.Timer外,所有定時器都具有與Start()和Stop()方法等效的功能。
所以擴展方法,如...
public static void Reset(this Timer timer)
{
timer.Stop();
timer.Start();
}
...是去了解它的一種方式。
你可以寫一個擴展方法稱爲復位(),它
重置windows.timer其它替代方式是使用計數器,如下所示:
int tmrCtr = 0;
Timer mTimer;
private void ResetTimer()
{
tmrCtr = 0;
}
private void mTimer_Tick()
{
tmrCtr++;
//perform task
}
因此,如果您打算每隔1秒重複一次,則可以將計時器間隔設置爲100ms,並將計數器測試爲10個週期。
如果計時器應等待某些進程可能在不同的時間間隔結束,那麼這很合適。
對於計時器(System.Windows.Forms.Timer)。
.Stop,然後.Start方法用作重置。
對於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
我只是分配一個新值定時器:
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
}
我這樣做
//Restart the timer
queueTimer.Enabled = true;
你可以做timer.Interval = timer.Interval
爲了清楚起見,因爲一些其他的評論是不正確的,使用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( )。
使用JP的解決方案使用擴展方法 – benPearce 2009-06-25 05:26:58
我也有同樣的需要重置,並提出相同的原因,FileSystemWatcher是不愉快和不方便使用 – 2009-10-29 05:52:03
如果您使用秒錶的定時器和擴展方法答案去,是小心,因爲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