C#如何在两个定时器周期之间运行延迟方法

本文关键字:周期 定时器 之间 运行 方法 延迟 两个 | 更新日期: 2023-09-27 18:00:55

我使用计时器每16分钟运行一个方法。我还想每分钟运行一个第二个方法,间隔15分钟。

以下是我正在使用的代码:

int count =  0;
private void cmdGo_Click(object sender, EventArgs e)
{
        System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
        t.Interval = 960000; // specify interval time - 16 mins
        t.Tick += new EventHandler(timer_Tick);
        t.Start();
}
void timer_Tick(object sender, EventArgs e)
{
        RunMethod1();
        while(count < 15)
        {
            //waiting for 60 seconds 
            DateTime wait = DateTime.Now;
            do
            {
                 Application.DoEvents();
            } while (wait.AddSeconds(60) > DateTime.Now);
            RunMethod2();
        }
}

上面的代码似乎工作得很好,但等待60秒的"do-while"循环占用了大量CPU。

我尝试使用Thread.Sleep(60000(,但这冻结了接口,还尝试在timer_Tick中添加第二个计时器,但这似乎不可能。能否在第一个计时器的EventHandler中添加第二个计时器?

有没有其他方法可以在不占用CPU的情况下实现这一点?

谢谢!Warren

注意:对不起,伙计们,我原来的帖子中有一个拼写错误。60秒的等待do,while循环应该在while<15循环。刚刚更新了代码片段。

因此:

  • RunMethod1((应每16分钟执行一次
  • RunMethod2((应在16分钟刻度之间每隔1分钟(15次(执行一次

C#如何在两个定时器周期之间运行延迟方法

如果有一个计数器来存储时钟关闭的次数,那就更有意义了。然后将计时器间隔设置为每分钟启动一次,这样就不会在两者之间做任何事情。。。

这样你就可以做…

private int Counter;
private void cmdGo_Click(object sender, EventArgs e)
{
    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 60000; // specify interval time - 1 minute
    t.Tick += new EventHandler(timer_Tick);
    t.Start();
}
// Every 1 min this timer fires...
void timer_Tick(object sender, EventArgs e)
{
    // If it has been 16 minutes then run RunMethod1
    if (++Counter >= 16)
    {
        Counter = 0;
        RunMethod1();         
        return;
    }
    // Not yet been 16 minutes so just run RunMethod2
    RunMethod2();
}

您可以await一个任务延迟,这样UI将继续响应

    async void timer_Tick(object sender, EventArgs e)
    {
        RunMethod1();

        while (count < 15)
        {
            //waiting for 60 seconds 
            await Task.Delay(60000);
            RunMethod2();
        }
    }