如何在 C# 中重置计时器?
Posted
技术标签:
【中文标题】如何在 C# 中重置计时器?【英文标题】:How to reset a timer in C#? 【发布时间】:2010-11-05 18:03:19 【问题描述】:我知道有三个 Timer
类,System.Threading.Timer
、System.Timers.Timer
和 System.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.Timer
和Threading.Timer
,还有Timers.Timer
。以上是关于如何在 C# 中重置计时器?的主要内容,如果未能解决你的问题,请参考以下文章