我使用计时器每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循环。刚刚更新了代码段。
所以:
答案 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();
}