Thread.CurrentThread.Join()什么时候有意义?

时间:2013-06-12 18:22:19

标签: c# multithreading c#-4.0

调用Thread.CurrentThread.Join()有什么影响,如果/什么时候调用它会有意义?

5 个答案:

答案 0 :(得分:14)

真的是

CurrentThread.Join()
你在实际代码中看到过的 - 我有点怀疑,除非它阻止其他线程加入当前线程 - 或者它是

CurrentThread.Join(someTimeout)

后者相当于

Thread.Sleep(someTimeout)

除了加入当前线程允许在GUI / COM情况下继续消息启动。

答案 1 :(得分:13)

  

调用Thread.CurrentThread.Join()

会产生什么影响

您将阻止当前线程的执行,并有效地将其锁死。它将导致当前线程阻塞,直到当前线程结束,这将永远不会发生。

  

,如果/何时调用它有意义?

这样做真的没有意义。你永远不应该以这种方式调用这个方法。


另一方面,由于您使用的是.NET 4,我建议您一般不要使用Thread.Join。使用新的Task / Task<T>类在很多方面都要好得多,因为您可以轻松附加延续(或者如果您确实需要阻止,则始终调用Task.Wait()。)

答案 2 :(得分:2)

不,CurrentThread.Join()毫无意义
 这可能会使您的程序停止运行,使线程 A 等待线程 A

答案 3 :(得分:1)

它实际上在可观察的世界中是有意义的。假设您在main中有一个队列侦听器,并且您希望永久保持主线程运行。 而不是执行while(true)并将代码放在循环中,最后一行可以写出来。这样,当前线程也将是应用程序中生成的其他线程的父线程。 将其视为应用的切入点。

答案 4 :(得分:1)

如果您要进行单元测试以测试计时器在Windows服务中是否运行良好,并且您在其中使用Thread.Sleep()语句的时间超过60秒,则可能会出现ContextSwitch错误,因为Thread.Sleep()正在阻止消息泵。

如果将单元测试中的Thread.Sleep()语句替换为Thread.CurrentThread.Join(),则这些ContextSwitch错误将消失。因此,这是一个非阻塞的解决方案。

您可以说Thread.CurrentThread.Join()是更好的Thread.Sleep()。