C# 后台线程未正确终止。

5
我有一个后台线程,用于与GUI分开处理,线程之间的一切工作都很正常。但是当我关闭应用程序时,程序“关闭”了,但没有终止进程。似乎后台线程正在保持程序运行。
我已经设置了“myThreadInstance.IsBackground = true;”,我认为这将要求C#在它被杀死时终止它。
我在Visual Studio(2010,使用.NET 4.0)中测试所有内容,在第一次构建后,其余所有构建都会失败,因为exe仍在使用中,因此无法覆盖它。在任务管理器中查看,它还在那里。杀死Visual Studio会释放vbhost进程,从而释放我的exe。杀死我的exe进程,会使vbhost在一两秒钟内重新生成它。

你是否在使用BackgroundWorker来完成这个任务? - Kangkan
请记住,后台线程是通过Thread.Abort中止的,这可以通过足够的权限阻止。我也不确定如果执行非托管代码时线程会快速中止吗?这两种情况可能吗? - Steven Sudit
发现启动 System.Net.HttpListener 也会阻止正确退出。 - fernacolo
3个回答

1
实际上,根据您的描述和其他尝试(以及它们的结果),我相信最有可能的原因是:
您的应用程序中有另一个前台线程,而不是您正在检查的线程。

0
这种类型的问题通常需要编写代码来解决。将您的应用程序简化到最少,以显示出问题所在。
然而,很可能是您没有发出线程终止信号,或者该线程运行时间过长,无法看到信号。

但这就是isBackground为true的意义所在。你不需要做任何事情,.NET应该会自动终止它。 - Nick
正如Sidharth所说,您不能依赖框架来为您清理。确保彻底的唯一方法是自己动手。无论如何,如果线程不响应信号,那么它将继续运行... - NotMe

0

我尝试使用BackgroundWorker,但是出现了同样的问题。所以我将其切换到线程,在另一个应用程序中它对我来说很好用。我不确定区别在哪里,为什么现在会挂起进程... - Nick
我没有看到代码发生了什么,所以无法确定,但有一件事很清楚,我们不能依赖框架来终止后台线程(它应该这样做)。因此,为了解决这个问题,您可能需要采取某种黑客手段。尝试在关闭应用程序时在后台线程上触发Abort。另外,Application.Exit(0)是否不起作用? - Sidharth Panwar
你是指MSDN页面上的哪个评论?根本就没有评论。你说的是哪个bug?我现在的应用程序也遇到了同样的问题。当出现未处理但可继续的异常时,没有后台线程会被终止,它们都会继续运行。当主窗口关闭时,我只能停止其中一些线程,而不能停止全部线程。而且没有前台线程了。(我已经在线程窗口中检查过了。) - ygoe
更新:我确实有一个前台线程,但是Visual Studio线程窗口没有显示这些信息。“工作线程”并不意味着后台线程,它也可以是前台线程。 - ygoe

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