关闭应用程序开启的所有线程

37

我有一个混合了C#和J#的大型应用程序。

有时候当我关闭它时,有一些线程没有关闭并且在任务管理器中挂起,无法从那里终止它们。

我很难找到所有这些线程并将它们添加到关闭事件中。

是否有一种方式可以在关闭事件中强制杀死由应用程序打开的所有线程?...

谢谢。

也许有一些工具可以告诉我,在我关闭应用程序时打开了哪些线程以及是谁打开的它们?


另请参见:关闭多线程应用程序 - Cody Gray
7个回答

54

这不应该发生,如果发生了,您的处理方式可能是错误的。

当您的应用程序退出时,.NET Framework会自动终止任何IsBackground属性设置为"True"的线程。将每个工作线程指定为后台线程,就不会再出现这个问题了。利用BackgroundWorkerThreadPool,它们可以自动创建后台线程,这是一个更好的选择。

否则,您需要明确清理前台线程。一个设计良好的应用程序将进行自己的簿记,并有一种确定性、结构化的方式来确保在退出Main方法之前关闭所有线程。如果您的线程需要优雅地终止,那么这正是您应该做的无论如何

杀死进程是非常糟糕的想法,让您的线程在应用程序中随意运行也是如此。


这确实是个不错的解释……但如果你在一个WCF Web服务中调用了一个线程,而该服务正处于某种未定义的状态,你不能无休止地等待下去。你必须杀死那个线程。没有其他方法,或者我错了吗? - Patrik
4
不要终止线程,使用超时调用网络服务。 @patrik - Cody Gray

18
您可以使用:Environment.Exit(0);,如果线程正在运行,这将关闭应用程序并不会引起任何问题。

这个代码可以正常工作,同时设置线程的IsBackground属性为True - Nitin Sawant

9
您应该优雅地关闭线程,但是我想让您和其他人知道一种不推荐但可能的方法: 在您的OnClose处理程序中:
System.Diagnostics.Process.GetCurrentProcess().Kill();
我完全赞同Cody Gray的做法。

是的,它可以工作,特别是如果您使用后台线程并尝试使用Environment.Exit(0)关闭所有内容。 - Mert Akkanat
太好了,我有一个复杂的线程在运行,找不到停止它的逻辑,直到退出。你的代码终止了它,后台没有再运行任何实例,谢谢。 - Alaa Sadik

4

嗯,你可以调用 Application.Exit() 但这没什么用。总之,如果你想做到正确的事情,你必须自己优雅地关闭所有线程。


1
没成功。我想你是指像其他答案一样使用 Environment.Exit(),那个是可行的。 - Hi-Angel

1

我的建议是...针对所有答案...

尝试强制关闭

将以下代码放入void CurrentApplication_Exit(object sender, ExitEventArgs e)private void Window_Closing(object sender, CancelEventArgs e)

System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
System.Windows.Application.Current.Shutdown();

0
internal void Close()
{
    Dispatcher.CurrentDispatcher.Thread.Abort();
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    Application.Current.Shutdown();
}

但是它看起来更好 Environment.Exit(0); - Mario
10
如果您在代码块中添加描述,答案将更有帮助。 - kukido
这是特定于 WPF 的,如果我没记错的话。 - Hossein

0

我在关闭表单/应用程序时遇到了类似的问题。它并没有真正从调试模式退出,而是回到了设计模式。以下方法解决了我的问题。

  1. 按照链接操作。 Windows Form Application, Thread won't stop
  2. 第一步没有解决它。 Environment.Exit(0); - 解决并且运行良好。

请提供链接的上下文,因为链接可能在未来失效。 - Abhishek Gurjar

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