C# 每秒钟后台定时器一次,这样对吗?

C# 每秒钟后台定时器一次,这样对吗?,c#,multithreading,timer,C#,Multithreading,Timer,我想每秒钟运行一次计时器。但是为了防止冻结,我不想在UI线程上运行它 因此,我使用的是另一个计时器,而不是设计师提供的内置计时器。 我不确定这是否是正确的方法 threadtimer = new System.Threading.Timer(timer, null, 1000, Timeout.Infinite); private void timer(object obj) { dowork..... thr

我想每秒钟运行一次计时器。但是为了防止冻结,我不想在UI线程上运行它

因此,我使用的是另一个计时器,而不是设计师提供的内置计时器。 我不确定这是否是正确的方法

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

            threadtimer.Change(1000, Timeout.Infinite);
        }
这似乎是错误的,我首先创建了线程,并告诉它在1000之后运行无限长的时间。 但我还是要复述一遍才能永远做到这一点。 如果第二个参数不成立,为什么还要有它呢?

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

按照您的方式,在当前计时器结束和下一个计时器启动之间将有一秒的延迟

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

如果回调时间超过一秒钟,那么可能会发生多个回调,但假设回调足够快,这不会成为问题

基本上,第一次回调将在创建计时器后的
arg3
毫秒进行,然后每隔
arg4
毫秒进行一次。更多细节和信息。

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

按照您的方式,在当前计时器结束和下一个计时器启动之间将有一秒的延迟

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

如果回调时间超过一秒钟,那么可能会发生多个回调,但假设回调足够快,这不会成为问题



基本上,第一次回调将在创建计时器后的
arg3
毫秒进行,然后每隔
arg4
毫秒进行一次。更多详细信息和。

您的
dowork将执行多长时间?
将执行多长时间?因此,另一个参数只是告诉线程将允许它生存多长时间?不,如果您能告诉我您的
dowork
运行多长时间,我可以告诉您更好的方法。@Sriram Sakthivel哦,好的dowork最多需要几毫秒,它只是得到一些int,并更新GUI。您的
dowork...
将执行多长时间?因此,另一个参数只是告诉它将允许线程生存多长时间?不,如果您能告诉
dowork
运行多长时间,我可以告诉您更好的方法。@Sriram Sakthivel哦,好吧,dowork最多需要几毫秒,它只需要一些int,并且更新GUI。啊,现在有了意义,我觉得我必须永远重做这个过程以保持它的活力是很奇怪的。虽然我已经测试了两个论点的写作时间,但似乎我没有。ThanksI确信通过Timeout.Infinite到第四个参数会在第一次调用后暂停计时器。如果发生了什么事情(如if(blabla)quit thread),可以告诉它退出/中止线程运行吗?@Steve,第三个参数的infinity意味着创建计时器,但不要启动它。@Steve,你在第四个论点上是对的。无穷大意味着第一次回调后的下一次回调将在宇宙热死后的某个时候发生:-)啊,现在有了意义,我认为我必须永远重复这个过程以保持它的活力是很奇怪的。虽然我已经测试了两个论点的写作时间,但似乎我没有。ThanksI确信通过Timeout.Infinite到第四个参数会在第一次调用后暂停计时器。如果发生了什么事情(如if(blabla)quit thread),可以告诉它退出/中止线程运行吗?@Steve,第三个参数的infinity意味着创建计时器,但不要启动它。@Steve,你在第四个论点上是对的。无穷大意味着第一次回调之后的下一次回调将在宇宙热寂之后的某个时间发生:-)