c# - Environment.Exit() 和 Application.Shutdown() 有什么区别?

标签 c# .net

有时当我调用时应用程序无法退出Application.Shutdown ,UI关闭了,但是进程还在运行。如何通过关闭所有线程来关闭应用程序? Environment.Exit () 可以关闭所有线程吗?或者我们应该调用 Win32 API TerminateThread 来完成它?

最佳答案

Environment.Exit()是一种更残酷的关闭应用程序的方式,是的。但总的来说,如果您需要终止您的应用程序以使其关闭,那么我认为您正在以错误的方式看待问题。 您应该调查为什么其他线程没有正常关闭。

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

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

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

请注意, Debug模式下的线程列表将显示一些正在运行但不受您控制的线程。这些线程很少有名称,当您单击它们时,您会收到一条消息说您没有符号。可以安全地忽略这些。

确保您的应用程序正常关闭的原因之一是某些资源(比如说 FileStream )没有完成工作,因此使用某些 API 强制它退出可能会产生各种“随机”问题进来,比如设置/数据文件没有被写入等等。

关于c# - Environment.Exit() 和 Application.Shutdown() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/905544/

相关文章:

c# - 为什么 ListView 对某些字符的渲染速度如此之慢?

c# - 创建新的数据库并填充另一个数据库

带有 JObject 元素的 C# JsonResult 返回空数组

c# - 隐式运算符是否比 ToString() 方法具有更高的优先级?

c# - .NET 中的 PDF 二进制数据输出

c# - 以编程方式从 Azure 表存储获取所有列名称的完整列表

c# - 通过 CRM 表单发送 onSave 电子邮件

javascript - 使用ajax将数据从文本框提交到asp net mvc Controller

c# - 如何将字符串数组转换为 IList<SomeType>?

c# - 如何通过端口 80 向 Azure 服务总线发送消息?