等待线程实际在c#中启动

时间:2011-10-08 23:01:55

标签: c# .net multithreading

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

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

我不喜欢这些伏都教睡眠(至少可以说),所以我正在寻找更好的方法来做到这一点。

有什么想法吗?

2 个答案:

答案 0 :(得分:20)

这样的事情:

var splashStart = new ManualResetEvent(false);

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

splashthread.Start();
splashStart.WaitOne();

不要忘记Dipose splashStart或者如果它在您的代码中合适,请使用using块。

编辑:未在IDE中确认原始代码。根据下面的评论,将等待更改为WaitOne()。

答案 1 :(得分:1)

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

特别是,等待另一个线程的线程必须在synclock 中检查对象是否已初始化,然后再执行Monitor.Wait。否则,在主线程到达Monitor.Wait之前,新线程可能会执行其Monitor.Pulse。添加对象初始化检查将阻止该方案。如果新线程在启动程序线程进入synclock检查并等待之前尚未初始化对象,则在启动程序线程通过Monitor.Wait放弃锁定之前,它将无法执行脉冲。如果新线程在启动程序线程进入synclock之前初始化了对象,则启动程序线程将看到该状态而不是等待。