在c#中等待线程真正启动

本文关键字:启动 线程 等待 | 更新日期: 2023-09-27 18:10:42

我需要启动一个线程,但是在之后继续线程实际上正在运行。现在我的代码看起来像:

        splashthread.IsBackground = false;
        splashthread.Start();
        Thread.Sleep(100); // Wait for the thread to start

我不喜欢这些巫术般的睡眠(至少可以说),所以我正在寻找更漂亮的方法来实现上述目标。

任何想法?

在c#中等待线程真正启动

像这样:

var splashStart = new ManualResetEvent(false);
var splashthread = new Thread(
  () =>
  {
     splashStart.Set();
     // Your thread code here...
  });
splashthread.Start();
splashStart.WaitOne();

不要忘记处理splashStart,或者如果在你的代码中合适的话,使用using块。

编辑:没有确认IDE中的原始代码。将Wait改为WaitOne()

为什么要关心其他线程何时启动?您可能有兴趣知道新线程何时达到某个特定的里程碑,并且可以使用任意数量的同步原语来处理它(除了事件之外,如果新线程将初始化构造线程可见的内容,则可以使用monitor . wait/monitor . pulse的监视器锁)。监视器锁是轻量级的,但是需要一点小心。

特别是,要等待另一个线程的线程必须在synclock内检查对象是否已初始化,然后才执行Monitor.Wait。否则,新线程可能会执行它的Monitor。在主线程到达监控器之前触发。添加对象初始化检查可以防止这种情况。如果在启动线程进入同步检查和等待之前,新线程还没有初始化对象,那么在启动线程通过Monitor.Wait放弃其锁之前,它将无法执行Pulse。如果在启动线程进入同步之前,新线程已经初始化了对象,那么启动线程将看到这个结果,并且根本不需要等待。