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

C# 如果前一个线程仍在运行,如何强制系统等待创建新线程?,c#,multithreading,join,timer,C#,Multithreading,Join,Timer,我正在程序中使用System.timer 正如我们所知,每个间隔都会创建新线程来处理OnTimedEvent 我正在寻找一种方法,如果前一个线程仍在运行,则强制系统等待创建新线程 我的OnTimedEvent执行某个方法,我想等待该方法完成 你知道怎么做吗?你搞错了,因为在触发事件时不会创建新线程。该事件将在.NET线程池上引发,因此任意线程将对其进行处理 执行所需操作的一种方法是在事件处理程序开始时停止计时器,并在完成后再次启动计时器。像这样: var timer = new System.T

我正在程序中使用
System.timer

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

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

我的
OnTimedEvent
执行某个方法,我想等待该方法完成


你知道怎么做吗?

你搞错了,因为在触发
事件时不会创建新线程。该事件将在.NET线程池上引发,因此任意线程将对其进行处理

执行所需操作的一种方法是在事件处理程序开始时停止计时器,并在完成后再次启动计时器。像这样:

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
。这稍微安全一点,因为上面的方法可能有一个竞争条件,即如果系统负载不足,则在计时器再次过期之前,您的处理程序可能无法保证执行。

thread.Join()//在此等待线程完成。你必须用定时器吗?你能不能不循环线程,并在最后计算下一次运行前的毫秒数,如果是肯定的话,那么这段时间内的睡眠时间?@Martin James-我将此应用程序用作windows服务,所以我想使用timer和noe while(true)循环,@MrFox,正如我所说,我使用timer。。。