关于定时器和可变间隔的问题

时间:2010-06-16 14:24:30

标签: c# timer

这个计时器的目的是在午夜时执行一些代码。 所以基本上,第一个间隔将在现在和午夜之间,之后的所有间隔将是24小时。

现在这一切都很好,但我想知道这个计时器业务是如何运作的。每次定时器重置时都会重新计算MyTimer.Interval吗?

System.Timers.Timer MyTimer = new System.Timers.Timer();
MyTimer.Elapsed += new ElapsedEventHandler(TriggeredMethod);
MyTimer.Interval = [pseudocode]Time between now and midnight[/pseudocode];
MyTimer.Start();

编辑:

我无法在TriggerMethod中设置Interval。我应该在哪里/如何启动Timer,这样我就不会出现任何上下文错误?

private void Form1_Load(object sender, EventArgs e)
{
System.Timers.Timer MyTimer = new System.Timers.Timer();
MyTimer.Elapsed += new ElapsedEventHandler(TriggeredMethod);
MyTimer.Start();
}

private void TriggerMethod(object source, ElapsedEventArgs e)
{
MyTimer.Interval = [pseudocode]Time between now and midnight[/pseudocode];
}

3 个答案:

答案 0 :(得分:4)

Interval属性是计时器调用之间的毫秒数。

要在午夜运行计时器,您需要将每个Interval事件中的Elapsed更改为(int)(DateTime.Today.AddDays(1) - DateTime.Now).TotalMilliseconds

要访问Elapsed处理程序中的计时器,您需要将计时器存储在班级的字段中,如下所示:

System.Timers.Timer MyTimer
private void Form1_Load(object sender, EventArgs e)
{
    MyTimer = new System.Timers.Timer();
    //...
}

顺便说一句,请注意,System.Timers.Timer不会在UI线程上触发 因此,您无法操纵Elapsed处理程序中的表单 如果您需要操纵表单,可以切换到System.Windows.Forms.Timer(不太准确)或致电BeginInvoke

答案 1 :(得分:1)

首次运行后,您必须更新间隔,从第二天的午夜减去当前时间并分配到间隔;我为我的一个批处理程序执行此操作,并且运行良好。

HTH。

答案 2 :(得分:0)

让你的计时器每小时点火一次,然后只在午夜进行实际工作。我还建议使用BeginInvoke将实际的UI交互移动到GUI线程上。