我想定期提出一个功能。 当我完成一个功能循环以等待一段时间并且只有它们开始第二次运行时。
我想这样做:
timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Enabled = true;
timer.Start();
timer.Elapsed += TimerTick;
private void TimerTick(object sender, EventArgs e)
{
//My functionality
}
但似乎TimerTick每隔一段时间就会被提升,而不是从我上一次的TimerTick运行开始。
我如何解决这个问题?
答案 0 :(得分:3)
您可以使用线程:
var thread = new Thread(o => {
while(true)
{
DoTick();
Thread.Sleep(1000);
}
});
答案 1 :(得分:0)
您可以在进行处理之前停止计时器,并在完成后再次启动计时器:
private void TimerTick(object sender, EventArgs e)
{
timer.Stop();
//My functionality
timer.Start();
}
将你的功能放在try-catch中并在finally部分调用Start()也是一个好主意。 (如果这适合你)
答案 2 :(得分:0)
尝试以下方法:
private void TimerTick(object sender, EventArgs e)
{
// get the timer that raised this event (you can have multiple
// timers, or the timer obj is out of scope here, so use this):
Timer timer = (Timer) sender;
// disable (or use timer.Stop())
timer.Enabled = false;
// ...
// your code
// ...
// at end, re-enable
timer.Enabled = true;
}
你会发现,在代码完成后,计时器现在将运行1000毫秒。您还可以使用timer.Stop()
和timer.Start()
。
答案 3 :(得分:0)
你可以做这样的事情:
while (true)
{
// your functions
Thread.Sleep(1000)
}
你必须找到一种通过外部机制来阻止它的方法,但它应该有效。
答案 4 :(得分:0)
你是对的:计时器每秒都会运行一次:它不关心你在TimerTick中做了什么。
您可以做的是在进入TimerTick方法时停止计时器。
private void TimerTick(object sender, EventArgs e)
{
timer.Stop();
//My functionality
timer.Start();
}
答案 5 :(得分:0)
试试这个:
DateTime lastDT = DateTime.MinValue;
private void TimerTick(object sender, EventArgs e)
{
DateTime now = DateTime.Now;
if (now - last).TotalSeconds > what_you_want
{
//My functionality
}
last = now;
}
使用此功能,您的表单(主线程)未锁定,您/用户可以随心所欲。
答案 6 :(得分:0)
尝试
private void TimerTick(object sender, EventArgs e)
{
timer.Stop();
// My Functionality
timer.Stop();
}
然而,你甚至可能会被解雇。根据{{3}}:
提升Elapsed事件的信号总是排队等待在ThreadPool线程上执行,因此事件处理方法可能在一个线程上运行,同时调用Stop方法在另一个线程上运行。这可能导致在调用Stop方法后引发Elapsed事件。下一节中的代码示例显示了解决此竞争条件的一种方法。
您可能需要考虑Thread.Sleep()
而不是