【问题标题】:What's the proper way to wait for a .NET thread to start up?等待 .NET 线程启动的正确方法是什么?
【发布时间】:2013-03-24 03:02:32
【问题描述】:

我在微软网站的线程教程中阅读了以下内容:

http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

MSDN 建议使用以下方法等待线程变为活动状态:

while (!oThread.IsAlive);

这是推荐的等待方式吗?插入“DoEvents”调用以允许主线程保持响应会更好吗?如果出现问题并且线程永远不会“活着”,应该如何进行错误处理?如果这是不好的做法,什么时候最好使用 IsAlive?

一些版主已将此标记为重复,但他们引用的另一个问题没有提及有关 IsAlive、DoEvents 或线程无法启动时的正确错误处理的任何内容。我的问题与我在问题中链接到的 MSDN 文章及其建议使用 IsAlive 的繁忙循环特别相关。

【问题讨论】:

  • 为什么需要等待线程存活?这是什么类型的应用程序? WinForms、WPF、Windows 服务、控制台、...
  • 我认为理想的解决方案是让您的主线程继续其业务,而无需关心线程何时开始。您的具体情况有哪些具体要求?
  • 一些微软的“教程”是……我该怎么说?现在有点过时了。特别是那个有一些我真的不想在教程中看到的东西。主线程通过while (!oThread.IsAlive); 进行忙碌等待,而不是使用ManualResetEvent 之类的东西。也没有任何理由说明你为什么需要做这样的事情!
  • @gonzobrains 是的,“不要这样做”是我的想法。 :) 你对正确的线程有多感兴趣?如果你愿意,我会挖出一个免费在线书籍的链接。
  • @gonzobrains:这是一个:albahari.com/threading 它甚至涵盖了 PLinq。我不认为它涵盖了新的 .Net 4.5 TPL。

标签: c# multithreading doevents


【解决方案1】:

目前还没有官方答案...你在MSDN上看到的是2003年的,这是比较老的技术。对于你想做的事情,我会使用Task Parallel Library (TPL)。这需要 .NET 框架 4.0+。

有关如何根据需要使用 TPL 的精彩教程,请参阅:

  1. Task Parallel 1 of n。

  2. J. Albahari's Threading in C#.

一旦您掌握了 TPL,请随时返回并寻找提出特定问题。

我希望这会有所帮助。

【讨论】:

  • 我认为你成功了。那篇 MSDN 文章只是过时了,而且不是很准确。这种情况只是证明“谷歌搜索”并不总是足够的。幸好我们有像你这样的家伙来补偿!
【解决方案2】:

除了 Killercam 的回答之外,我想指出链接页面上的示例代码是垃圾。看起来有人被告知“创建一个仅显示我们在一个页面上拥有的所有不同方法的示例”。它真的是这样出来的......

在进行线程处理时,您几乎从不在轮询循环中等待。尤其是没有任何等待的紧张。它们会使 CPU 变热,不可靠,如果您在那里休眠,则具有高延迟,并且有更好的方法来做到这一点。自旋循环适用于知道自己在非常具体的情况下正在做什么的专家。

等待线程“活着”是没有意义的。为什么有人会在真实代码中这样做?这甚至不意味着您的线程 proc 已经开始执行(真的!它没有。)。

我建议您使用现代范式。 TPL 是一个很好的起点。请参阅 Killercam 的回答。

【讨论】:

  • 我明白你的意思。为了保护这篇文章,也许有些人会为了同步目的而等待它活着?我只是猜测。不过,可能有更好的方法来实现它。
  • 没有意义,因为活着没有意义。这并不意味着您的线程进程已经启动,因为线程可能刚刚在第一条指令处被调度。原则上这样做是没有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2013-01-09
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多