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

Posted

技术标签:

【中文标题】如何在 C# 中重置计时器?【英文标题】:How to reset a timer in C#? 【发布时间】:2010-11-05 18:03:19 【问题描述】:

我知道有三个 Timer 类,System.Threading.TimerSystem.Timers.TimerSystem.Windows.Forms.Timer,但它们都没有 .Reset() 函数,可以将当前经过的时间重置为 0。

是否有具有此功能的 BCL 类?有没有一种非黑客的方式来做到这一点? (我想也许改变它的时间限制可能会重置它)想想重新实现具有此功能的 Timer 类有多难,或者如何使用 BCL 类之一可靠地做到这一点?

【问题讨论】:

使用JP的解决方案使用扩展方法 我也有同样的重置需求,出于同样的原因,FileSystemWatcher 使用起来不愉快且不方便 如果您使用 Stopwatch 作为计时器并使用扩展方法答案,请小心,因为 Stopwatch.Restart 扩展方法将在 .NET 4.0 中提供。 msdn.microsoft.com/en-us/library/… 【参考方案1】:

重置 windows.timer 的其他替代方法是使用计数器,如下所示:

int timerCtr = 0;
Timer mTimer;

private void ResetTimer() => timerCtr = 0;
private void mTimer_Tick()

    timerCtr++;
    // Perform task
  

所以如果你打算每 1 秒重复一次,你可以将定时器间隔设置为 100ms,并将计数器测试为 10 个周期。

如果计时器应该等待一些可能在不同时间跨度结束的进程,这是合适的。

【讨论】:

我什至不知道ctr 是什么。我猜它是counter,但即便如此,我还是不知道这应该是什么意思。是在计算滴答声还是什么? 是的,感谢您尝试编辑,但答案似乎让我感到困惑,我完全不明白 @ivan 想要做什么。【参考方案2】:

我刚刚为计时器分配了一个新值:

mytimer.Change(10000, 0); // 重置为 10 秒

对我来说很好用。

在代码顶部定义计时器:System.Threading.Timer myTimer;

if (!active)
    myTimer = new Timer(new TimerCallback(TimerProc));

myTimer.Change(10000, 0);
active = true;

private void TimerProc(object state)

    // The state object is the Timer object.
    var t = (Timer)state;

    t.Dispose();
    Console.WriteLine("The timer callback executes.");
    active = false;
    
    // Action to do when timer is back to zero

【讨论】:

【参考方案3】:

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

为 Timers.Timer 和 Forms.Timer 调用 Stop()-Start() 为 Threading.Timer 调用 Change

【讨论】:

【参考方案4】:

你可以timer.Interval = timer.Interval

【讨论】:

【参考方案5】:

我这样做

//Restart the timer
queueTimer.Enabled = true;

【讨论】:

这只是启用它。即使它事先被禁用,重新启用也不会更改已收集到该点的经过时间。【参考方案6】:

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

所以一个扩展方法比如...

public static void Reset(this Timer timer)

  timer.Stop();
  timer.Start();

...是解决问题的一种方法。

【讨论】:

我不想测量经过的时间。我对此的确切用例是我有一个 FileSystemWatcher 监视一个目录并想要捕获更改组(即,例如在彼此相距 5 秒内进行的更改)。理论是第一次更改启动一个计时器,每次更改都会重置,直到它最终触发并关闭组。 是的,当我重新阅读您的问题时,我发现了这一点。编辑了我的答案。 这行得通,重要的是要注意,如果您只调用timer.Start(),这将行不通。我做了this Linqpad query 来测试它。尝试删除其中的timer.Stop,您会看到区别。【参考方案7】:

对于System.Timers.Timer,根据 MSDN 文档,http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:

如果在 Timer 启动后设置间隔,则计数为 重置。例如,如果您将时间间隔设置为 5 秒,然后设置 Enabled 属性为 true,计数从 Enabled 开始 放。如果在 count 为 3 秒时将间隔重置为 10 秒, Elapsed 事件在 13 秒后第一次引发 已启用设置为 true。

所以,

    const double TIMEOUT = 5000; // milliseconds

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

    :
    :

    aTimer.Interval = TIMEOUT;  // restart the timer

【讨论】:

这里的问题是你并不总是知道你想要重置计时器是否已经运行。因此,您必须执行 aTimer.Interval = TIMEOUT 和 aTimer.Start()。所以总的来说,上面的重置函数使用更少的行和变量。不过很好的补充。 我也看到了这样的问题。我所做的是:aTimer.Interval = aTimer.Interval。这触发了循环正在进行。打败我为什么但它有效......【参考方案8】:

对于计时器 (System.Windows.Forms.Timer)。

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

【讨论】:

【参考方案9】:

我总是这样......

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

...这是黑客行为吗? :)

根据评论,在 Threading.Timer 上,它是 Change method ...

dueTime 类型:System.Int32 之前延迟的时间量 调用指定的回调方法 当 Timer 被构建时,在 毫秒。指定 Timeout.Infinite 防止 计时器从重新开始。指定零 (0) 立即重新启动计时器。

【讨论】:

另一个问题是只有 Forms.Timer 工作,而我的应用程序没有 GUI(Application.Start() 没有参数),所以我认为 Threading.Timer 类更适合其他原因,但很好。 @Matthew:请参阅msdn.microsoft.com/en-us/magazine/cc164015.aspx,了解有关各种计时器类的讨论以及何时使用它们是合适的。不过,一般来说,Forms.Timer 只能与 GUI 一起使用。但是,除了Forms.TimerThreading.Timer,还有Timers.Timer

以上是关于如何在 C# 中重置计时器?的主要内容,如果未能解决你的问题,请参考以下文章

通知意图 - 如何在不重置的情况下恢复通知中的活动?

刷新网页时如何防止倒数计时器重置?

在 Unity 中使用按钮重置计时器

每当单击按钮时如何重置计时器

如何重置 setInterval 计时器?

如何使用 Timer 类调用方法,做某事,重置计时器,重复?