我知道有三个Timer
类,System.Threading.Timer
,System.Timers.Timer
和System.Windows.Forms.Timer
,但这些类都没有.Reset()
函数,它会将当前经过的时间重置为0。
有没有这个功能的BCL类?这样做有非破解方法吗? (我想也许改变它的时间限制可能会重置它)考虑重新实现具有此功能的Timer
类有多难,或者如何使用其中一个BCL类可靠地完成它?
我经常做 ...
myTimer.Stop();
myTimer.Start();
......那是一个黑客? :)
每条评论,关于Threading.Timer,它是Change method ...
dueTime类型:
System.Int32
在调用构造Timer时指定的回调方法之前延迟的时间量,以毫秒为单位。指定Timeout.Infinite
以防止计时器重新启动。指定零(0)立即重启计时器。
你可以做timer.Interval = timer.Interval
除System.Threading.Timer之外,所有计时器都具有等效的Start()和Stop()方法。
所以扩展方法如......
public static void Reset(this Timer timer)
{
timer.Stop();
timer.Start();
}
......是一种解决方法。
对于System.Timers.Timer
,根据MSDN文档,http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:
如果在定时器启动后设置了间隔,则重置计数。例如,如果将间隔设置为5秒,然后将Enabled属性设置为true,则计数将在Enabled设置时开始。如果在计数为3秒时将间隔重置为10秒,则在Enabled设置为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
你可以编写一个名为Reset()的扩展方法
我刚为计时器分配了一个新值:
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
}
为清楚起见,因为其他一些注释不正确,使用System.Timers
设置Enabled为true将重置已用时间。我刚刚测试了下面的行为:
Timer countDown= new Timer(3000);
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()
。
对于Timer(System.Windows.Forms.Timer)。
.Stop,然后.Start方法用作重置。
重置windows.timer的其他替代方法是使用计数器,如下所示:
int tmrCtr = 0;
Timer mTimer;
private void ResetTimer()
{
tmrCtr = 0;
}
private void mTimer_Tick()
{
tmrCtr++;
//perform task
}
因此,如果您打算每1秒重复一次,则可以将定时器间隔设置为100ms,并将计数器测试为10个周期。
如果计时器应该等待可能在不同时间跨度结束的某些进程,这是合适的。
我这样做
//Restart the timer
queueTimer.Enabled = true;