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

本文关键字:有意义 Join Thread CurrentThread 什么时候 | 更新日期: 2023-09-27 18:18:00

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

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

这是真的吗

CurrentThread.Join()
你在实际代码中看到的

——我有点怀疑,除非它是为了防止其他线程加入当前线程——或者是

CurrentThread.Join(someTimeout)

后者相当于

Thread.Sleep(someTimeout)
如果您在GUI/COM的情况下,加入当前线程允许消息泵送继续。

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

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

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

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


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

这在可观察的世界里是有意义的。假设你在main中有一个队列监听器,你想让主线程永远运行下去。而不是执行while(true)并将代码放入循环中,最后一行可以这样写。这样,当前线程也将是应用程序中派生的其他线程的父线程。

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

如果你正在做一个单元测试,测试计时器是否在Windows服务中表现良好,并且你使用Thread.Sleep()语句,其中超过60秒,你可以得到ContextSwitch错误,因为Thread.Sleep()阻塞了消息泵。

如果你在单元测试中用Thread.CurrentThread.Join()代替那些Thread.Sleep()语句,那么这些ContextSwitch错误就会消失。所以这是一个非阻塞解。

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

CurrentThread.Join()可以用来使当前线程处于睡眠状态,直到另一个线程打断它。

例如,你可能有一个服务器,其中main方法设置了一个其他线程池来处理传入的请求,将对当前线程的引用传递给shutdown-trap,然后进入睡眠状态,直到服务器关闭。

这不是一个非常常见的模式,但如果你想让当前线程在被中断之前一直处于睡眠状态,那么说没有是错误的。