我有一个混合了C#和J#的大型应用程序。
有时候当我关闭它时,有一些线程没有关闭并且在任务管理器中挂起,无法从那里终止它们。
我很难找到所有这些线程并将它们添加到关闭事件中。
是否有一种方式可以在关闭事件中强制杀死由应用程序打开的所有线程?...
谢谢。
也许有一些工具可以告诉我,在我关闭应用程序时打开了哪些线程以及是谁打开的它们?
这不应该发生,如果发生了,您的处理方式可能是错误的。
当您的应用程序退出时,.NET Framework会自动终止任何IsBackground
属性设置为"True"的线程。将每个工作线程指定为后台线程,就不会再出现这个问题了。利用BackgroundWorker
类和ThreadPool
类,它们可以自动创建后台线程,这是一个更好的选择。
否则,您需要明确清理前台线程。一个设计良好的应用程序将进行自己的簿记,并有一种确定性、结构化的方式来确保在退出Main
方法之前关闭所有线程。如果您的线程需要优雅地终止,那么这正是您应该做的无论如何。
杀死进程是非常糟糕的想法,让您的线程在应用程序中随意运行也是如此。
IsBackground
属性为True
。 - Nitin SawantSystem.Diagnostics.Process.GetCurrentProcess().Kill();
我完全赞同Cody Gray的做法。
嗯,你可以调用 Application.Exit()
但这没什么用。总之,如果你想做到正确的事情,你必须自己优雅地关闭所有线程。
Environment.Exit()
,那个是可行的。 - Hi-Angel我的建议是...针对所有答案...
尝试强制关闭
将以下代码放入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();
}
我在关闭表单/应用程序时遇到了类似的问题。它并没有真正从调试模式退出,而是回到了设计模式。以下方法解决了我的问题。