如果前一个线程仍在运行,如何强制系统等待创建新线程?

时间:2012-04-07 19:43:06

标签: c# multithreading join timer

我在我的程序中使用System.Timers

我们知道每个时间间隔都会创建新线程来处理OnTimedEvent

我正在寻找强制系统在前一个线程仍在运行时等待创建新线程的方法。

我的OnTimedEvent执行一些方法,我想等到方法完成

知道怎么做吗?

1 个答案:

答案 0 :(得分:2)

在触发Elapsed事件时,不会创建新线程,这是错误的。该事件将在.NET threadpool上引发,因此任意线程将处理它。

执行所需操作的一种方法是在事件处理程序开始时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。这有点安全,因为上述方法可能具有竞争条件,如果系统处于负载状态,则可能无法保证在计时器再次运行之前执行处理程序。