我正在GUI中运行一些后台线程。目前我正在实现个人线程取消代码,但线程中有IsBackground属性,根据MSDN,它们将自行取消。
我知道它会变成令人讨厌的Thread.Abort()但是在这个后台线程中没有任何东西可以保持正常状态或者需要适当的清理。
如果用户只是在后台线程中间关闭应用程序,我试图避免任何崩溃。由于多线程场景很难测试,我想就此问题征求您的意见。
基本上,我只是设置IsBackground = True而忘记其余的代码而不是滚动自己的代码?
答案 0 :(得分:5)
IsBackground
媒体资源上的MSDN page声明:
线程是后台线程 或前景线程。背景 线程与前景相同 线程,除了背景 线程不会阻止进程 终止。一切都是前景 属于某个进程的线程有 终止,共同语言 运行时结束进程。任何 剩余的背景线程是 停了但没完成。
所以这对我来说意味着你必须让你的线程非常防守,以确保它不会让任何连接断开,数据库半写等等。任何关键都需要在前台线程中防止申请截止,直至完成。
答案 1 :(得分:5)
Jonathan Greensted's post有一个关于IsBackground
的好摘要:
IsBackground属性允许您 告诉运行时线程是否为a 前景(UI)线程或背景 线。默认情况下所有线程都是 创建为前台线程,除非 你改变了这个属性。
那么我们为什么要关心?
嗯,.NET运行时做了些什么 最后一个前景时特别 线程终止 - 它中止所有 后台线程并终止 应用。 (我们知道Thread.Abort是 但是如果应用程序是坏的话 无论如何,关闭是坏事 持续时间非常有限。)
换句话说,后台线程中的工作是否可以在应用程序关闭时随时停止?
如果没有那么它应该是一个前台线程 - 所以使用文件句柄或打开数据库连接的线程理想情况下应该是应用程序退出等待该线程在退出之前完成的前景。
答案 2 :(得分:4)
Thread.Abort抛出一个异常,所以如果你的代码已经被正确编写为最终/使用,它应该会正常失败并释放所有资源。
修改的
我应该提供一些细节。首先,异常是ThreadAbortException类型。有趣的是,即使你抓住它并且什么都不做,它也不会消失。换句话说,一旦它离开你的阻挡块,它就会继续被抛出。这是因为捕获异常并吞下它的(通常很糟糕的)做法并不能阻止线程中止。如果你真的想要停止中止,你需要捕获异常,然后调用Thread.ResetAbort。
答案 3 :(得分:0)
我认为这取决于资源。 例如,当进程结束时,套接字会安全关闭。 对于某些资源,您最好在退出线程之前将其释放。