创建新的System.Thread实例时,默认值IsBackground
为false。任何人都可以阐明为什么这将是默认值是不正确的。创建线程时,我的倾向是正确与否,它将在主线程的后台运行。
感谢您的快速回复。
我确实在我的组件的析构函数中提供了功能,以允许线程优雅地结束。我使用的是ManualResetEvent
和Join
。
我完全理解允许线程优雅地结束是正确和正确的。 我没有概念化的是为什么。默认情况下,如果一个线程在应用程序退出时未成功结束,则它必须挂起整个应用程序。
答案 0 :(得分:22)
IsBackground
表示当应用程序终止时,线程终止。这很少是理想的行为,因为这意味着线程无法正常停止和清理。
相反,应用程序应该通知线程终止,等待它完成,然后正确关闭。
这是我对Thread.IsBackground
MSDN article:
线程是后台线程 或前景线程。背景 线程与前景相同 线程,除了背景 线程不会阻止进程 终止。一切都是前景 属于某个进程的线程有 终止,共同语言 运行时结束进程。任何 剩余的背景线程是 停了但没完成。
答案 1 :(得分:4)
来自IsBackground
上的MSDN页面的此信息解释了后台和前台线程之间的区别。
线程是后台线程或前台线程。后台线程与前台线程相同,除了后台线程不会阻止进程终止。一旦属于进程的所有前台线程终止,公共语言运行库就结束该进程。任何剩余的后台线程都会停止并且不会完成。
答案 2 :(得分:2)
通常,在.NET中,如果要创建自己的线程,那么它将用于长时间运行的进程。在这种情况下,如果用户关闭主窗体,通常不希望销毁线程。相反,你希望有一个很好的机会正确处理清理工作。
如果您只想在后台线程中运行快速工作项,请使用ThreadPool。对于任何不是长时间运行的工作项,这通常会更好。
答案 3 :(得分:2)
前景与背景的概念可能有点令人困惑。正如其他人指出的那样,背景方面只会影响运行时是否会关闭进程。如果没有前台线程,则无论后一个前台线程何时终止都运行后台线程的数量,它都将关闭该进程。
对于在“主线程的后台”中运行的新线程,实际情况并非如此。每个新线程将默认为与主线程相同的优先级,因此它们将像主线程一样频繁地调度,因此主线程在这个意义上并没有真正接受任何特殊处理。线程是根据优先级而不是它们恰好是前台线程还是后台线程来安排的。
您当然可以设置新线程的后台/前台和优先级,但默认情况下新线程等于初始线程。
答案 4 :(得分:0)
> 我完全理解允许线程优雅地结束是正确和正确的,但我缺少的是,为什么默认情况下一个线程必须挂起整个应用程序,如果它没有成功结束。 <<
除非那些后台线程正在做一些非常无害的事情,否则挂起进程(一段时间 - 直到它们退出)可能比强制它们关闭更好 - 如果你让它们成为后台线程,你有当他们退出时无法控制他们正在做什么。另一种方法是跟踪您在“后台”线程中运行的任务。当你的主线程想要关闭时,它应该通知线程取消,并让它们有机会优雅地退出。如果它们无法正常退出,您可以中止它们(或将它们设置为背景,但在您准备结束后台线程之前不要让主线程退出)。请记住,如果你中止一个线程会发生一些不好的事情 - 如果它正在写入文件,那么该文件可能已损坏,等等