我想每秒钟掉一个Timer。但我不想在UI线程上运行它,以防止冻结。
所以,我使用的是另一个计时器而不是Designer提供的内置计时器。 我不太确定这是否是正确的方法。
threadtimer = new System.Threading.Timer(timer, null, 1000, Timeout.Infinite);
private void timer(object obj)
{
dowork.....
threadtimer.Change(1000, Timeout.Infinite);
}
这似乎不对,我首先创建线程,并告诉它在1000之后运行,无限时间。 而且我仍然需要复述它来永远这样做。 如果它不成立,我为什么还要有第二个参数?
答案 0 :(得分:5)
你没有有这样做。第三个参数(dueTime = 1000)是最初调用计时器之前的延迟,第四个参数(句点=无穷大)控制周期性,后续回调的频率,不时间生成回调。
你拥有它的方式,当前计时器的 end 与下一次计时器被触发的时间之间会有一秒钟的延迟。
如果您希望每秒都发生这种情况,您只需为这两个参数提供1000,而不必担心必须从回调中重新启动计时器。
可能最终会发生多次回调,如果它们花费的时间超过一秒,但假设回调速度足够快,那就不会有问题。
基本上,在创建定时器之后,第一次回调将是arg3
毫秒,然后每隔arg4
毫秒。更多详情here for the constructor和here for the Change
method。