0

我想每秒运行一个计时器。但我不想在 UI 线程上运行它,以防止冻结。

所以,我使用的定时器不是 Designer 提供的内置定时器。我不太确定这是否是正确的方法。

  threadtimer = new System.Threading.Timer(timer, null, 1000, Timeout.Infinite);
        private void timer(object obj)
        {
            dowork.....

            threadtimer.Change(1000, Timeout.Infinite);
        }

这似乎是错误的,我首先创建了线程,并告诉它在 1000 之后运行无限时间。我仍然必须重新讲述它才能永远做到这一点。如果它不成立,为什么我什至还有第二个论点?

4

1 回答 1

5

你不必那样。第三个参数 (dueTime = 1000) 是最初调用计时器之前的延迟,第四个参数 (period = infinity) 控制周期性性质,即后续回调完成的频率,而不是生成回调的时间。

按照您的方式,在当前计时器结束和下一个计时器被触发之间会有一秒的延迟。

如果您希望它每秒发生一次,您可以简单地为这两个参数提供 1000,而不必担心必须从回调中重新启动计时器。

如果它们花费的时间超过一秒,那么最终可能会发生多个回调,但是假设回调足够快,那将不是问题。

基本上,第一个回调将arg3在您创建计时器之后的毫秒数arg4之后,然后每隔毫秒。有关构造函数的更多详细信息,请参见此处Change方法

于 2013-08-31T09:05:06.807 回答