我需要启动一个线程,但在线程实际运行之后继续。现在我的代码看起来像:
splashthread.IsBackground = false;
splashthread.Start();
Thread.Sleep(100); // Wait for the thread to start
我不喜欢这些伏都教睡眠(至少可以说),所以我正在寻找更好的方法来做到这一点。
有什么想法吗?
答案 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之前初始化了对象,则启动程序线程将看到该状态而不是等待。