什么时候Thread.CurrentThread.Join()有意义?
本文关键字:有意义 Join Thread CurrentThread 什么时候 | 更新日期: 2023-09-27 18:18:00
调用Thread.CurrentThread.Join()的效果是什么,如果/何时调用它是有意义的?
这是真的吗
CurrentThread.Join()
你在实际代码中看到的——我有点怀疑,除非它是为了防止其他线程加入当前线程——或者是
CurrentThread.Join(someTimeout)
后者相当于
Thread.Sleep(someTimeout)
调用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,然后进入睡眠状态,直到服务器关闭。
这不是一个非常常见的模式,但如果你想让当前线程在被中断之前一直处于睡眠状态,那么说没有是错误的。