当我调用 Application.Shutdown 时,应用程序无法退出,UI已关闭,但该过程仍在运行。如何关闭所有线程关闭应用程序? Environment.Exit()可以关闭所有帖子吗?或者我们应该调用Win32 API TerminateThread 来执行此操作?
答案 0 :(得分:19)
Environment.Exit()是一种更残酷的方式来关闭你的应用程序是的,但一般来说,如果你需要你杀死你的应用程序使其关闭然后我认为你以错误的方式看待问题。 你应该考虑为什么其他线程没有优雅地关闭?
您可以查看主窗体上的FormClosing event并关闭挂起应用程序的所有资源,防止它关闭。
这就是我发现资源挂起应用程序的方式。
请注意,调试模式下的线程列表将显示一些运行但不在您控制之下的线程,这些线程几乎有一个名称,当您单击它们时,您会收到一条消息,指出您没有符号。这些可以被忽视
确保你的应用程序优雅地关闭的原因之一是,如果某些资源(假设FileStream)没有完成工作,那么使用一些api强制它快速可以使各种各样的“随机的“问题进来,比如没有写入的设置/数据文件等等。
答案 1 :(得分:9)
答案 2 :(得分:2)
正如Shay所说,永远不要调用TerminateThread,TerminateThread只会杀死一个线程而不会让它自行清理,这可能导致进程中其他线程出现死锁和损坏。
另一方的TerminateProcess将终止整个进程并让操作系统清理,这是关闭进程的最快方法 - 你只需要确保你没有持有操作系统无法清理的任何资源(它也可以在调用TerminateProcess之前关闭窗口。)
我想,但我没有检查过,Environemnt.Exit调用了TerminateProcess。
Application.Shutdown非常不同,它不会立即终止进程 - 它会发送所有关闭和关闭通知,并等待所有应用程序的窗口和线程自行关闭。