这个计时器的目的是在午夜时执行一些代码。 所以基本上,第一个间隔将在现在和午夜之间,之后的所有间隔将是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];
}
答案 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线程上。