【问题标题】:Dispose all resources on form close c#在表单关闭 c# 上处理所有资源
【发布时间】:2015-05-26 07:49:45
【问题描述】:

我想在表单关闭时处理我的表单的所有资源(绑定的事件、变量、对象、数据结构、数据绑定等)。目前,我正在我的一个表单上明确地处理我的资源,只是为了测试这个操作。但是我的应用程序很大,其中有很多表单,如果我开始在每个表单上明确地处理所有资源,这将需要时间。所以我的问题是有没有一般的方法或技术?这样我的所有资源都会被处理掉,而不是一一明确地处理。

谢谢。

【问题讨论】:

  • 通常 CLR 垃圾收集器会处理您代码中管理的任何内容

标签: c# forms winforms dispose idisposable


【解决方案1】:

您应该对 IDisposable 对象使用 using 语句,而不是调用 Dispose()。

通常,当您使用 IDisposable 对象时,您应该在 using 语句中声明和实例化它。 using 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所示使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。在 using 块中,对象是只读的,不能修改或重新分配。

using (Font font1 = new Font("Arial", 10.0f)) 
{
     byte charset = font1.GdiCharSet;
}

https://msdn.microsoft.com/en-us/library/yh598w02.aspx

【讨论】:

    【解决方案2】:

    在表单关闭事件上使用Application.Exit() 方法。

    MSDN 说:

    它将通知所有消息泵它们必须终止,然后 处理完消息后关闭所有应用程序窗口。

    【讨论】:

      【解决方案3】:

      我同意@Owen Pauling,您应该使用 IDisposable 和相关语法。强烈建议您为每个对象确定对象生命周期的范围,而不是像在 Closing 事件中处理所有对象这样的通用方式。

      如果您在当前情况下束手无策,您可以利用GC.Collect()。但是,请注意,除非您非常确定自己需要此功能,否则不建议使用此功能,并且调用此功能会提高应用程序的性能。

      要获得最大的好处,您应该像@Owen Pauling 推荐的那样实现 IDisposable,然后从当前表单的父线程调用 GC.Collect()。即您将需要创建一个外壳(可见/不可见)表单来调用您拥有的实际表单。处理完所有工作的表单后,请致电GC.Collect()

      参考 - https://msdn.microsoft.com/en-us/library/s5zscb2d%28v=vs.85%29.aspx 建议谨慎练习 callto GC.Collect 的做法。

      【讨论】:

        【解决方案4】:

        如果是您自己的资源,您可以将它们移动到一个类容器中,并在其中的一个方法中实现所有 IDispose 逻辑。 否则,您只能通过在每个表单中创建 Array _resources 并调用类似的东西来减少代码

        foreach(IDisposable elem in _resources){ elem.Dispose();}
        

        或者使用反射来实现同样的技巧。

        此外,我认为这不是你真正的问题。 Dispose() 调用 在一个人的 Jack 上不会花费很长时间,这与 Dispose() 实现不同

        性能优化的通则:先找到瓶颈,再优化。

        【讨论】:

          猜你喜欢
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 2013-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          相关资源
          最近更新 更多