在表单关闭c#上处理所有资源

时间:2015-05-26 07:49:46

标签: c# forms winforms dispose idisposable

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

感谢。

4 个答案:

答案 0 :(得分:3)

您应该对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 :(得分:1)

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

MSDN说:

  

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

答案 2 :(得分:1)

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

如果你在当前的情况下被束缚,你可以利用GC.Collect()。但是,请注意,在您确定需要此功能之前不建议使用此功能,并且通过调用此功能获得的回报高于应用程序的性能。

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

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

答案 3 :(得分:1)

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

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

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

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

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