题 杀死应用程序打开的所有线程


我有一些非常大的应用程序混合使用c#和j#。

有时当我关闭它时,有一些线程没有关闭,它们挂在任务管理器中,不可能从那里杀死它们。

我真的有问题找到所有这些线程并将它们添加到结束事件中。

是否有某种方式猛烈杀死在关闭事件中由应用程序打开的所有线程?...

谢谢。

是否有一些工具可以告诉我在关闭应用程序时打开了哪些线程?


31
2018-02-15 10:12


起源


另见: 关闭多线程应用程序 - Cody Gray♦


答案:


这个 不应该发生,如果是的话,你试图以错误的方式解决它。

当您的应用程序退出时,.NET Framework将自动终止其所有线程 IsBackground 属性 设置为“True”。将每个工作线程指定为后台线程,您将不再遇到此问题。利用这个 BackgroundWorker 类 和 ThreadPool 类,自动创建后台线程,是一个更好的选择。

否则,您需要明确清理前台线程。一个设计合理的应用程序将执行自己的簿记,并具有确定的,结构化的方式,以确保在退出之前已关闭其所有线程 Main 方法。这就是你应该做的 无论如何 如果你的线程需要优雅的终止。

杀死这个过程是一个非常糟糕的主意,因为让你的线程在你的应用程序中无所畏惧地运行。


45
2018-02-15 10:18



这个对我有用 - S.M.Mousavi
好吧,这是一个很好的解释....但是,如果你从一个服务陷入某种未定义状态的线程调用WCF Web服务,该怎么办?你不能无休止地等待。你必须杀死那个线程。没有其他办法或我错了? - Patrik
你没有杀死线程,你超时调用Web服务。 @patrik - Cody Gray♦


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


13
2018-05-05 22:09



这与设定一起工作 IsBackground thread的属性设置为 True - Nitin Sawant


好吧,你可以打电话 Application.Exit() 但这不会有太大帮助。 最重要的是,如果你想正确地做事,你必须自己优雅地关闭所有的线程。


4
2018-02-15 10:15



没工作。我想你的意思 Environment.Exit() 就像在另一个答案中那样有效。 - Hi-Angel


你应该优雅地关闭你的线程,但只是希望你和其他人知道不推荐但可能的方式:

在您的OnClose处理程序上:

System.Diagnostics.Process.GetCurrentProcess().Kill();

我完全喜欢Cody Gray的做法。


4
2018-05-05 06:31





我的2美分...所有答案......

尽量强制关机

投入 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
2018-04-18 12:51





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

0
2018-01-08 03:52



但它看起来更好Environment.Exit(0); - Mario
如果您向代码块添加描述,答案会更有帮助。 - kukido