【问题标题】:Wait for a thread to actually start in c#等待一个线程在c#中实际启动
【发布时间】:2011-10-09 08:56:33
【问题描述】:

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

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

我不喜欢这些伏都教睡眠(至少可以这么说),所以我正在寻找更漂亮的方法来完成上述操作。

有什么想法吗?

【问题讨论】:

  • 嗯,在 Sleep() 调用之后,您究竟写了什么。没有什么是相当常见的,所以只需删除睡眠。
  • 我正在与几台服务器握手(我正在执行 xml-rpc 调用)
  • 嗯,这从 sn-p 对某人来说是显而易见的。

标签: c# .net multithreading


【解决方案1】:

类似这样的:

var splashStart = new ManualResetEvent(false);

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

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

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

编辑:没有在 IDE 中确认原始代码。根据下面的评论将 Wait 更改为 WaitOne()。

【讨论】:

【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多