C#如何在计时器滴答之间运行延迟方法

时间:2014-04-29 09:09:26

标签: c# timer delay

我使用计时器每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密集型?

谢谢! 沃伦

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

所以:

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

2 个答案:

答案 0 :(得分:1)

您可以await任务延迟,以便用户界面继续响应

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



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

            RunMethod2();
        }
    }

答案 1 :(得分:1)

有一个计数器来存储时钟已经消失了多少次更有意义。然后将你的计时器间隔设置为每分钟一次,所以不要做任何事情......

那样你就可以......

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();
}