在关闭窗体时释放所有资源的方法 c#

3
我希望在关闭表单时处理所有资源(绑定事件、变量、对象、数据结构、数据绑定等)。目前,我只是为了测试此操作而在我的一个表单上逐个显式地处理资源。但是,我的应用程序很大,其中有许多表单,如果我开始在每个表单上显式地处理所有资源,那么将需要时间。因此,我的问题是是否有一种通用的方法或技术,可以处理所有资源,而不是逐个显式地处理它们。
谢谢。

2
通常CLR垃圾收集器会处理您代码中管理的任何内容。 - Iman Nemati
4个回答

4

在使用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


1
在您的窗体关闭事件中使用 Application.Exit() 方法。 MSDN 上说:
它会通知所有消息泵它们必须终止,然后在处理完消息后关闭所有应用程序窗口。

1
我同意@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其中建议小心使用GC.Collect

1
如果这些资源是您自己的,您可以将它们移动到一个类容器中,并在那里实现所有IDispose逻辑的一个方法。 否则,您只能通过在每个表单中创建Array _resources并调用类似于以下内容的内容来减少代码量。
foreach(IDisposable elem in _resources){ elem.Dispose();}

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

此外,我认为这不是你真正的问题。一个人调用Dispose()方法不会花费很长时间,不像Dispose()方法本身的实现。

性能优化的常规规则:首先找到瓶颈,然后进行优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接