首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于定时器和可变间隔的问题

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

Stack Overflow用户
提问于 2010-06-16 22:24:30
回答 3查看 2K关注 0票数 3

这个计时器的作用是在午夜的时候执行一些代码。因此,基本上,第一个间隔将是从现在到午夜,之后的所有间隔将是24小时。

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

代码语言:javascript
复制
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中设置时间间隔时遇到了问题。我应该在哪里/如何启动计时器,这样我就不会得到任何上下文错误?

代码语言:javascript
复制
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];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-16 22:28:22

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

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

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

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2010-06-16 22:25:51

在第一次运行之后,您必须更新时间间隔,从第二天的午夜减去当前时间并分配给时间间隔;我对我的一个批处理过程执行了此操作,它工作得很好。

HTH。

票数 1
EN

Stack Overflow用户

发布于 2010-06-16 22:45:21

让你的计时器每小时触发一次,然后只在午夜做实际的工作。我还推荐使用BeginInvoke将实际的UI交互移动到GUI线程上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3054147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档