Environment.Exit()和Application.Shutdown()之间有什么区别?

时间:2009-05-25 06:13:48

标签: c# .net

当我调用 Application.Shutdown 时,应用程序无法退出,UI已关闭,但该过程仍在运行。如何关闭所有线程关闭应用程序? Environment.Exit()可以关闭所有帖子吗?或者我们应该调用Win32 API TerminateThread 来执行此操作?

3 个答案:

答案 0 :(得分:19)

Environment.Exit()是一种更残酷的方式来关闭你的应用程序是的,但一般来说,如果你需要你杀死你的应用程序使其关闭然后我认为你以错误的方式看待问题。 你应该考虑为什么其他线程没有优雅地关闭?

您可以查看主窗体上的FormClosing event并关闭挂起应用程序的所有资源,防止它关闭。

这就是我发现资源挂起应用程序的方式。

  1. 在调试模式下启用显示threads(这将允许您查看应用程序正在运行的所有线程)
  2. 以不正确关闭的方式关闭应用程序。
  3. 按Visual Studio中的暂停
  4. 查看线程列表,然后单击它们以查看它们挂起的代码在哪里,现在您可以看到哪些资源阻止您的应用程序关闭转到您的FormClosing事件并关闭/处置它们。
  5. 重复,直到应用程序正确关闭:)
  6. 请注意,调试模式下的线程列表将显示一些运行但不在您控制之下的线程,这些线程几乎有一个名称,当您单击它们时,您会收到一条消息,指出您没有符号。这些可以被忽视

    确保你的应用程序优雅地关闭的原因之一是,如果某些资源(假设FileStream)没有完成工作,那么使用一些api强制它快速可以使各种各样的“随机的“问题进来,比如没有写入的设置/数据文件等等。

答案 1 :(得分:9)

  1. 您应从不致电TerminateThread
  2. 确保您生成的所有线程都标记为背景,这样当您关闭应用程序时它就不会等待它们完成。

答案 2 :(得分:2)

正如Shay所说,永远不要调用TerminateThread,TerminateThread只会杀死一个线程而不会让它自行清理,这可能导致进程中其他线程出现死锁和损坏。

另一方的TerminateProcess将终止整个进程并让操作系统清理,这是关闭进程的最快方法 - 你只需要确保你没有持有操作系统无法清理的任何资源(它也可以在调用TerminateProcess之前关闭窗口。)

我想,但我没有检查过,Environemnt.Exit调用了TerminateProcess。

Application.Shutdown非常不同,它不会立即终止进程 - 它会发送所有关闭和关闭通知,并等待所有应用程序的窗口和线程自行关闭。