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

本文关键字:线程 系统 何强制 等待 创建 新线程 一个 如果 运行 | 更新日期: 2023-09-27 18:30:16

我在程序中使用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。这更安全一些,因为上述方法可能具有争用条件,即如果系统负载不足,则可能无法保证处理程序在计时器再次运行之前执行。