11

调用 Thread.CurrentThread.Join() 的效果是什么,以及是否/何时调用它有意义?

4

5 回答 5

16

真的吗

CurrentThread.Join()

你在真实代码中看到的 - 我有点怀疑,除非它是一些黑客来阻止其他线程加入当前线程 - 或者是它

CurrentThread.Join(someTimeout)

后者相当于

Thread.Sleep(someTimeout)

除了如果您处于 GUI / COM 情况下,加入当前线程允许消息泵送继续。

于 2013-08-02T06:08:04.550 回答
14

调用 Thread.CurrentThread.Join() 的效果是什么

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

,以及是否/何时调用它有意义?

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


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

于 2013-06-12T18:25:46.717 回答
3

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

于 2017-06-15T11:58:36.017 回答
2

不, CurrentThread.Join() 没有意义这可能会使您的程序停止运行,例如
使线程A等待线程A。

于 2013-06-12T18:25:37.917 回答
1

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

如果您用 Thread.CurrentThread.Join() 替换单元测试中的那些 Thread.Sleep() 语句,那么那些 ContextSwitch 错误将会消失。所以它是一个非阻塞的解决方案。

你可以说 Thread.CurrentThread.Join() 是一个更好的 Thread.Sleep()。

于 2019-09-23T13:02:55.057 回答