【发布时间】:2011-02-15 10:12:33
【问题描述】:
我有一些非常大的 c# 和 j# 混合应用程序。
有时当我关闭它时,有一些线程没有关闭,它们挂在任务管理器中,无法从那里杀死它们。
我真的很难找到所有这些线程并将它们添加到关闭事件中。
是否有某种方式暴力杀死应用程序在关闭事件中打开的所有线程?...
谢谢。
是否有一些工具可以告诉我在关闭应用程序时打开了哪些线程以及谁打开了它们?
【问题讨论】:
我有一些非常大的 c# 和 j# 混合应用程序。
有时当我关闭它时,有一些线程没有关闭,它们挂在任务管理器中,无法从那里杀死它们。
我真的很难找到所有这些线程并将它们添加到关闭事件中。
是否有某种方式暴力杀死应用程序在关闭事件中打开的所有线程?...
谢谢。
是否有一些工具可以告诉我在关闭应用程序时打开了哪些线程以及谁打开了它们?
【问题讨论】:
这不应该发生,如果是的话,你正试图以错误的方式解决它。
当您的应用程序退出时,.NET Framework 将自动终止所有IsBackground property 设置为“True”的线程。将您的每个工作线程指定为后台线程,您将不再有这个问题。利用自动创建后台线程的BackgroundWorker class 和ThreadPool class 是一个更好的选择。
否则,您需要明确清理前台线程。一个设计合理的应用程序会自己记账,并有一种确定的、结构化的方式来确保在退出Main 方法之前已关闭其所有线程。如果您的线程需要优雅终止,这就是您应该做的无论如何。
杀死进程是一个非常糟糕的主意,就像让你的线程在你的应用程序中随意运行一样。
【讨论】:
你可以使用:Environment.Exit(0); ,如果线程正在运行,这将关闭应用程序并且不会导致任何问题。
【讨论】:
IsBackground 属性一起工作被设置为True
你应该优雅地关闭你的线程,但只是想让你和其他人知道不推荐但可能的方式:
在您的 OnClose 处理程序上:
System.Diagnostics.Process.GetCurrentProcess().Kill();
我完全喜欢 Cody Gray 的做法。
【讨论】:
好吧,您可以致电Application.Exit(),但这不会有太大帮助。
底线是,如果你想正确地做事,你必须自己优雅地关闭所有线程。
【讨论】:
Environment.Exit() 就像在另一个答案中一样,有效。
我的 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();
【讨论】:
internal void Close()
{
Dispatcher.CurrentDispatcher.Thread.Abort();
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Application.Current.Shutdown();
}
【讨论】:
我在关闭表单/应用程序时遇到了类似的问题。它并没有真正退出调试模式,而是进入了设计模式。以下解决了我的问题。
【讨论】: