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

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

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

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

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

  1. 在调试模式下启用线程显示(这将允许您查看应用程序正在运行的所有线程)
  2. 以不正确关闭的方式关闭应用程序。
  3. 按Visual Studio中的暂停
  4. 查看线程列表,然后单击它们以查看它们挂起的代码在哪里,现在您可以看到哪些资源阻止您的应用程序关闭转到FormClosing事件并关闭/处置它们。
  5. 重复,直到应用程序关闭正确:)

请注意,调试模式下的线程列表将显示一些运行但不受您控制的线程,这些线程几乎有一个名称,当您单击它们时,您会收到一条消息,指出您没有符号。 这些可以被忽略

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

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

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

另一方面,TerminateProcess将终止整个进程并让操作系统清理,这是关闭进程的最快方法 – 你必须确保你没有持有操作系统无法清理的任何资源(这也有助于在调用TerminateProcess之前关闭窗口)。

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

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