有三个Timer
班,我知道的,System.Threading.Timer
,System.Timers.Timer
,和System.Windows.Forms.Timer
,但这些都没有一个.Reset()
这将当前经过时间重置为0功能。
是否有具有此功能的BCL类?有没有一种非骇客的方式?(我认为可能更改其时限可能会重置它)思考重新实现Timer
具有此功能的类有多困难,或者如何使用一个BCL类可靠地实现它?
有三个Timer
班,我知道的,System.Threading.Timer
,System.Timers.Timer
,和System.Windows.Forms.Timer
,但这些都没有一个.Reset()
这将当前经过时间重置为0功能。
是否有具有此功能的BCL类?有没有一种非骇客的方式?(我认为可能更改其时限可能会重置它)思考重新实现Timer
具有此功能的类有多困难,或者如何使用一个BCL类可靠地实现它?
Answers:
我经常做 ...
myTimer.Stop();
myTimer.Start();
...那是黑客吗?:)
根据评论,在Threading.Timer上,它是Change方法 ...
dueTime类型:
System.Int32
调用构造Timer时指定的回调方法之前要延迟的时间,以毫秒为单位。指定Timeout.Infinite
以防止计时器重新启动。指定零(0)可立即重启计时器。
Forms.Timer
只应与GUI一起使用。但是,除了Forms.Timer
,Threading.Timer
还有Timers.Timer
。
除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后13秒内将首次引发Elapsed事件。
所以,
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
}
为了清楚起见,由于其他一些注释不正确,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参考源中看到,如果启用一个已经启用的计时器,它将调用private UpdateTimer()
方法,该方法在内部调用Change()
。
UpdateTtimer
当且仅当的当前值Enabled
不等于new 时,才调用private 方法value
。