这个计时器的作用是在午夜的时候执行一些代码。因此,基本上,第一个间隔将是从现在到午夜,之后的所有间隔将是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中设置时间间隔时遇到了问题。我应该在哪里/如何启动计时器,这样我就不会得到任何上下文错误?
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];
}发布于 2010-06-16 22:28:22
Interval属性是计时器调用之间的毫秒数。
要在午夜运行计时器,需要将每个Elapsed事件中的Interval更改为(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。
发布于 2010-06-16 22:25:51
在第一次运行之后,您必须更新时间间隔,从第二天的午夜减去当前时间并分配给时间间隔;我对我的一个批处理过程执行了此操作,它工作得很好。
HTH。
发布于 2010-06-16 22:45:21
让你的计时器每小时触发一次,然后只在午夜做实际的工作。我还推荐使用BeginInvoke将实际的UI交互移动到GUI线程上。
https://stackoverflow.com/questions/3054147
复制相似问题