线程池和.NET中的.IsBackground

7

MSDN以及许多其他来源声称线程池中的工作线程始终是后台线程。

"线程池线程是后台线程。" (MSDN)

"池化线程始终是后台线程。" (C#中的线程,Joseph Albahari)

通过设置,我可以轻松地使工作线程成为非后台线程

Thread.CurrentThread.IsBackground = false;

应用程序将一直等待,直到线程完成。

这有什么问题吗?

3个回答

13

是的,你可以更改它们。但你不应该这样做。

出于与借来的汽车重新油漆相同的原因,其他线程属性(如优先级和MTA)也是如此。

如果你想要不同类型的线程,请创建自己的线程。


6

线程什么时候结束?当你的方法结束时吗?我非常怀疑这是正确的。线程池的整个重点在于,一旦你的线程完成,它就会被放回到池中以便重复使用。现在你已经放开了一个线程,它已经回到了线程池中,而你的应用程序仍在运行,因为它是前台线程。没有办法将该线程取出并终止它。


谢谢。我理解使池化线程非后台程序所引起的问题。我的观点是为什么框架没有以更明显的方式禁止这样做?说实话,我期望会出现异常。无论如何,谢谢。 - Dmitry Karpezo

4
线程池线程是后台线程,它们的IsBackground属性被初始化为True,而使用Thread类创建的线程则不是。将其设置为false可能有点冒险。线程池线程被回收利用,我不确定该属性是否会被重新初始化。它不是与物理操作系统线程相关联的属性,它们没有IsBackground行为,而是由CLR放置在其周围的封装器添加了此属性。因此,很可能是的,但没有太多原因去搞乱它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接