【问题标题】:Killing all threads that opened by application杀死应用程序打开的所有线程
【发布时间】:2011-02-15 10:12:33
【问题描述】:

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

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

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

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

谢谢。

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

【问题讨论】:

标签: c# .net j#


【解决方案1】:

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

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

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

杀死进程是一个非常糟糕的主意,就像让你的线程在你的应用程序中随意运行一样。

【讨论】:

  • 嗯,是的,这是一个很好的解释.... 但是,如果您从服务卡在某个未定义状态的线程中调用 WCF Web 服务怎么办。你不能无休止地等待。你必须杀死那个线程。没有其他办法还是我错了?
  • 您不会杀死线程,而是使用超时调用 Web 服务。 @patrik
【解决方案2】:

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

【讨论】:

  • 这与设置线程的IsBackground 属性一起工作被设置为True
【解决方案3】:

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

在您的 OnClose 处理程序上:

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

我完全喜欢 Cody Gray 的做法。

【讨论】:

  • 是的,它可以工作,特别是如果您使用后台线程并尝试使用 Environment.Exit(0) 关闭所有线程
  • 太好了,我有一个复杂的线程正在运行,但没有发现在退出前停止它的逻辑。您的代码杀死了它,并且没有更多实例在后台运行,谢谢
【解决方案4】:

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

【讨论】:

  • 没用。我认为您的意思是 Environment.Exit() 就像在另一个答案中一样,有效。
【解决方案5】:

我的 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();

【讨论】:

    【解决方案6】:
    internal void Close()
    {
        Dispatcher.CurrentDispatcher.Thread.Abort();
        Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
        Application.Current.Shutdown();
    }
    

    【讨论】:

    • 但看起来更好 Environment.Exit(0);
    • 如果您在代码块中添加描述,答案会更有帮助。
    • 如果我没记错的话,这是 wpf 特有的
    【解决方案7】:

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

    1. 点击链接。 Windows Form Application, Thread won't stop
    2. 第一步没有解决它。 Environment.Exit(0); - 解决并工作正常。

    【讨论】:

    • 请提供链接的上下文,因为链接将来可能会过期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多