我在我的程序中使用了System.Timers
。如果前一个线程仍在运行,我该如何强制系统等待创建新线程?
正如我们所知道的每个区间创建新线程来处理OnTimedEvent
。
我正在寻找方法来强制系统等待创建一个新的线程,如果前一个线程仍在运行。
我OnTimedEvent
执行一些方法,我想等到结束该方法
任何想法如何做到这一点?
我在我的程序中使用了System.Timers
。如果前一个线程仍在运行,我该如何强制系统等待创建新线程?
正如我们所知道的每个区间创建新线程来处理OnTimedEvent
。
我正在寻找方法来强制系统等待创建一个新的线程,如果前一个线程仍在运行。
我OnTimedEvent
执行一些方法,我想等到结束该方法
任何想法如何做到这一点?
您错误地认为在启动Elapsed
事件时不会创建新线程。该事件将在.NET线程池中引发,因此任意线程都会处理它。
一种方法可以做到你想要的是Stop
在你的事件处理程序开始时的计时器和Start
一旦它完成。像这样:
var timer = new System.Timers.Timer(1000);
timer.Elapsed += HandleTimerElapsed;
timer.Start();
...
private void HandleTimerElapsed(object s, ElapsedEventArgs e)
{
var t = (System.Timers.Timer)s;
t.Stop();
try {
... do some processing
}
finally { // make sure to enable timer again
t.Start();
}
}
另一种方法是将计时器的AutoReset
属性设置为false。这样计时器只会升起一次。然后,您可以在需要重新开始时拨打Start
。因此,上面的代码会在开始时更改为包含timer.AutoReset = false;
,然后您不需要在处理程序中调用Stop
。这更安全一些,因为上面的方法可能有竞争条件,因为如果系统处于加载状态,那么在定时器再次运行之前,处理程序可能无法保证执行。
非常好Idea-谢谢! – MoShe 2012-04-07 20:06:51
thread.Join()//在此等待,直到线程完成。 http://stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net – MrFox 2012-04-07 19:48:49
你必须使用计时器吗?你能不能简单地循环线程,并最终计算出下一次运行需要多少毫秒,如果是正数,那么该时间睡眠? – 2012-04-07 19:59:24
@Martin詹姆斯 - 我使用这个应用程序作为Windows服务,所以我想使用计时器和noe while(true)循环,@ MrFox,因为我说我使用计时器... – MoShe 2012-04-07 20:04:50