2

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

正如我们所知,每个间隔都会创建新线程来处理OnTimedEvent.

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

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

知道怎么做吗?

4

1 回答 1

2

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;在开头包含 a ,然后您无需Stop在处理程序内部调用。这更安全一点,因为上述方法可能存在竞争条件,即如果系统处于负载状态,您的处理程序可能无法保证在计时器再次结束之前执行。

于 2012-04-07T20:05:02.017 回答