如何在C#中重置计时器?

Mat*_*ley 108 c# timer

有三个Timer,我知道的课程,System.Threading.Timer,System.Timers.Timer,和System.Windows.Forms.Timer,但这些都没有一个.Reset()这将当前经过时间重置为0功能.

有没有这个功能的BCL类?这样做有非破解方法吗?(我想也许改变它的时间限制可能会重置它)考虑重新实现Timer具有此功能的类有多难,或者如何使用其中一个BCL类可靠地执行它?

JP *_*oto 143

我经常做 ...

myTimer.Stop();
myTimer.Start();
Run Code Online (Sandbox Code Playgroud)

......那是一个黑客?:)

每条评论,关于Threading.Timer,它是Change方法 ......

dueTime类型:System.Int32在构造Timer时调用指定的回调方法之前延迟的时间量,以毫秒为单位.指定 Timeout.Infinite以防止计时器重新启动.指定零(0)立即重启计时器.

  • @Matthew:有关各种计时器类的讨论,请参阅http://msdn.microsoft.com/en-us/magazine/cc164015.aspx,以及何时使用它们是合适的.但是,一般情况下,`Forms.Timer`只能与GUI一起使用.但是,除了`Forms.Timer`和`Threading.Timer`之外,还有`Timers.Timer`. (3认同)

Dan*_*Dan 57

除System.Threading.Timer之外,所有计时器都具有等效的Start()和Stop()方法.

所以扩展方法如......

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}
Run Code Online (Sandbox Code Playgroud)

......是一种解决方法.

  • 我不想测量经过的时间。我的具体用例是,我有一个 FileSystemWatcher 监视一个目录,并希望捕获一组更改(即,例如 5 秒内进行的更改)。其理论是,第一个更改会启动一个计时器,该计时器会随着每次更改而重置,直到它最终触发并关闭该组。 (2认同)

mMo*_*ntu 24

对于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
Run Code Online (Sandbox Code Playgroud)


Gis*_*shu 6

您可以编写一个名为Reset()的扩展方法

  • 调用Stop() - Timers.Timer和Forms.Timer的Start()
  • 调用Threading的更改.Timer


Nic*_*pag 5

为了清楚起见,因为其他一些注释是不正确的,当使用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");
}
Run Code Online (Sandbox Code Playgroud)

我会反复向文本框输入文本,并且计时器只会在最后一次击键后运行 3 秒。正如您将看到的,文档中也暗示了这一点:调用Timers.Start()只是将 Enabled 设置为 true。

可以肯定的是,我应该从一开始就直接进入,您将在.NET 参考源中看到,如果启用已启用的计时器,它将调用私有UpdateTimer()方法,该方法在内部调用Change().