我有一些非常大的应用程序混合使用c#和j#。
有时当我关闭它时,有些线程没有关闭,它们挂在任务管理器中,不可能从那里杀死它们。
找到所有这些线程并将它们添加到结束事件中我真的有问题。
是否有某种方法会猛烈杀死关闭事件中应用程序打开的所有线程?...
感谢。
是否有一些工具可以告诉我在关闭应用程序时打开了哪些线程?是谁打开了它们?
答案 0 :(得分:49)
这个不应该发生,如果是的话,你试图以错误的方式解决它。
当您的应用程序退出时,.NET Framework将自动终止IsBackground
property设置为“True”的所有线程。将每个工作线程指定为后台线程,您将不再遇到此问题。利用自动创建后台线程的BackgroundWorker
class和ThreadPool
class是一个更好的选择。
否则,您需要明确清理前台线程。设计合理的应用程序将执行自己的簿记,并具有确定性的结构化方法,以确保在退出Main
方法之前已关闭其所有线程。如果您的线程需要正常终止,那么您应该无论如何。
杀死这个过程是一个非常糟糕的主意,因为让你的线程在你的应用程序中不知不觉地运行。
答案 1 :(得分:14)
您可以使用:Environment.Exit(0); ,如果线程正在运行并且不会导致任何问题,那将关闭应用程序。
答案 2 :(得分:5)
你应该优雅地关闭你的线程,但只是希望你和其他人知道不推荐但可能的方式:
OnClose处理程序上的:
System.Diagnostics.Process.GetCurrentProcess().Kill();
我完全喜欢Cody Gray的做法。
答案 3 :(得分:4)
好吧,你可以打电话给Application.Exit()
,但这不会有太大帮助。
最重要的是,如果你想正确地做事,你必须自己优雅地关闭所有线程。
答案 4 :(得分:0)
我的2美分......所有答案......
尝试强制SHUTDOWN
加入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();
答案 5 :(得分:0)
internal void Close()
{
Dispatcher.CurrentDispatcher.Thread.Abort();
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Application.Current.Shutdown();
}
答案 6 :(得分:0)
我在关闭表格/申请时遇到了类似的问题。它并没有真正退出调试模式,而是进入了设计模式。以下解决了我的问题。