2012-07-09 83 views
0

如果我有拥有管理IDisposable对象需要保持周围的窗体的寿命(即一流水平的成员,或许是一类包装和管理的单元测试的缘故定时器)形式,什么时候应该打电话Dispose()我应该在哪里处理由表单管理的对象?

对于这个问题(避免“GC将其丢弃你”式的答案),我们还假设有额外的停机逻辑我需要调用,例如着想:

Buffer.Flush() 
Buffer.Dispose() 

我可以将其放入我的部分类(Form.Designer.vb)中Dispose()方法的现有实现中,但修改该类通常是不被接受的。

看来,FormClosedDisposed事件将是最好的选择。任何理由选择一个在另一个之上?

+0

如果它实现了'IDisposable',则应该用'using'语句包装资源的创建。 – Oded 2012-07-09 20:21:28

+0

如果是需要留级的班级成员,我不能那样做,对吗? (编辑问题添加这个额外的信息) – 2012-07-09 20:27:07

+0

不,你不能这样做与领域。从你的问题中不清楚这是一个领域。请编辑并澄清。 – Oded 2012-07-09 20:28:06

回答

2

“正确的”方法是将Dispose()方法从窗体的Designer.vb文件移动到窗体的源代码文件并对其进行编辑。然而,这在vb.net IDE中很尴尬,它隐藏了那个文件。您必须单击“显示所有文件”图标才能看到它。

使用FormClosed是错误的,当显示的ShowDialog您的形式,将处置你的对象太早()。当您检索对话结果时,这可能会导致ObjectDisposed异常。

使用Disposed事件很好。

0

在C#winforms中,我将Dispose()方法的实现从设计器移动到代码隐藏文件。从来没有遇到过问题。我猜你可以在VB中做同样的事情。

这是唯一重要的事情是,你保持这种部署的Components收集的代码。

0

一般而言,您应该尽可能安全地释放非托管资源,例如使用using语句。它通常会使您的应用程序更安全地维护并减少与资源生命周期相关的死锁和其他不当行为,而不是习惯性地将资源保留在“以防万一”或完全不必要的情况下。但是,出于性能方面的原因,有时您需要“缓存”非托管资源,或者出于语义原因(例如,在UI级别上互斥的某些有意锁定方案),您甚至需要保留一个资源。

在这些情况下,从父对象的Dispose调用Dispose是一个很好的约定;在这种情况下通过处理Disposed事件。

FormClosed由于另一个处理程序可能会阻止关闭发生,或者父窗体的处理程序代码可能会调用此窗体的方法,并且您最终可能会使用已处理的资源,因此风险更大。当在整个表单上直接调用Dispose时,再加上从不释放资源的风险。

将任何代码放入FormClosed的主要优势是“更加健康”的操作环境,尤其是对父表单的访问。然而,这很少需要处理非托管资源。

相关问题