如何在c#中反复触发给定时间间隔的事件?

时间:2013-06-02 04:37:46

标签: c# .net multithreading winforms

如何安排事件,例如我需要调用一个应该在每个给定秒内执行其操作的方法。我正在开发简单的Windows窗体应用程序,我尝试使用像

while(true)
{
 methodToBeScheduled();
 Thread.Sleep(60000);
}

这段特殊的代码使我的应用程序在执行时“无响应”。我希望计时器可以做到这一点或你专家建议的任何其他逻辑,请告诉我。

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用WinForms timer

Timer _timer;

// In constructor (or anywhere you want to start the timer, e.g. a button event):
_timer = new Timer();
_timer.Interval = 60000;    // milliseconds
_timer.Tick += (sender, e) => methodToBeScheduled();
_timer.Start();

这将导致{60}每60秒调用一次methodToBeScheduled。它将在主UI线程上调用,因此请避免在其中进行任何繁重的处理。

使用此计时器的优点是它内置,不需要线程同步,并且易于使用。缺点是间隔不准确 - 实际间隔将根据应用程序中需要处理的其他消息而变化,并且也受Windows系统时钟的限制,只能精确到10-20ms或如此。

答案 1 :(得分:1)

您可以使用Timer(System.Threading.Timer)。

using System;
using System.Threading;

Timer _timer = null;


_timer = new Timer(o =>
    {
        methodToBeScheduled();
    });
_timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(60));

答案 2 :(得分:1)

Var sequence = Observable.interval(1).publish Sequence.subscribe ....

允许订阅一个可以每秒触发onnext的observable。见反应性扩展..

在iPad上讨厌打字....

答案 3 :(得分:0)

是的,.net中有三种不同类型的计时器(所有这些计时器都被命名为Timer,但行为略有不同)。 windows.forms计时器以一定的速率执行一个函数 - 它从UI线程调用该函数。 System.Threading Timer执行相同操作但从另一个线程调用该函数。还有另一个我不记得的计时器了。你必须根据自己的情况选择其中一个。

线程计时器是我的最爱。如果使用它,Here就是一个例子。请记住,无论您调用的是什么,都不是从UI线程完成的。如果这是一个问题,可能想要使用表单计时器或同步事物。