0

如果我有一个表单,它拥有IDisposable需要在表单的生命周期内保留的托管对象(即类级别成员,也许是为了单元测试而包装和管理计时器的类),我应该什么时候调用Dispose()它们?

为了这个问题(为了避免“GC将为您处理”类型的答案),我们还假设我需要调用额外的关闭逻辑,例如:

Buffer.Flush()
Buffer.Dispose()

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

看来FormClosedorDisposed事件将是最好的选择。有什么理由选择一个而不是另一个?

4

3 回答 3

2

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

使用 FormClosed 是错误的,当您的表单使用 ShowDialog() 显示时,它会过早地处理您的对象。当您检索对话结果时,这可能会导致 ObjectDisposed 异常。

使用 Disposed 事件很好。

于 2012-07-09T20:43:08.860 回答
0

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

唯一重要的是保留处理Components集合的代码。

于 2012-07-09T20:31:56.147 回答
0

一般来说,您应该尝试在安全的情况下尽快释放非托管资源,例如使用using语句。与您习惯性地“以防万一”或完全不必要地保持资源可用相比,它通常使您的应用程序维护起来更安全,并且更不容易出现与资源生命周期相关的死锁和其他不当行为。

但是,有时您出于性能原因需要“缓存”非托管资源,或者出于语义原因甚至需要保留一个资源(例如,一些用于 UI 级别互斥的有意锁定方案)。

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

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

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

于 2012-07-09T20:33:54.380 回答