背景计时器每秒,这是正确的方法吗?

时间:2013-08-31 08:58:37

标签: c# multithreading timer

我想每秒钟掉一个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之后运行,无限时间。 而且我仍然需要复述它来永远这样做。 如果它不成立,我为什么还要有第二个参数?

1 个答案:

答案 0 :(得分:5)

你没有这样做。第三个参数(dueTime = 1000)是最初调用计时器之前的延迟,第四个参数(句点=无穷大)控制周期性,后续回调的频率,时间生成回调。

你拥有它的方式,当前计时器的 end 与下一次计时器被触发的时间之间会有一秒钟的延迟。

如果您希望每秒都发生这种情况,您只需为这两个参数提供1000,而不必担心必须从回调中重新启动计时器。

可能最终会发生多次回调,如果它们花费的时间超过一秒,但假设回调速度足够快,那就不会有问题。

基本上,在创建定时器之后,第一次回调将是arg3毫秒,然后每隔arg4毫秒。更多详情here for the constructorhere for the Change method