我正在调查我的应用程序中的零星崩溃,但仍然不确定是什么导致它。当我想要关闭包含VB 6.0或VC 6.0 Text控件的MDI表单时,有时会发生这种情况 - 它的C#包装为Interop。在查看代码时,我注意到我有一些这样的代码:
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing) //Disposing of everything: managed and unmanaged resources.
{
moTextEditor.Dispose(); --here
moTextEditor.Dispose(); --here
}
// Deal with our own & whatever other unmanaged resources (this used to be done in the finalizer, above)
SetLockedFields(false);
disposed = true;
}
}
注意到 moTextEditor.Dispose(); 行重复了两次?你怎么看?这可能是问题吗?
答案 0 :(得分:6)
IDisposable interface的Dispose文档具体说明:
如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用。如果多次调用Dispose方法,则该对象不得抛出异常。除了Dispose之外的实例方法可以在已经处理资源时抛出ObjectDisposedException。
如果对象正确实现了IDisposable
,这应该不是问题。
话虽如此,并非IDisposable
的所有实现都遵循规则。我个人会说该对象有一个错误,如果多次调用Dispose
有问题,应该更正。
答案 1 :(得分:2)
重复处理看起来像是一个错误,但通常不应该导致任何问题。
如果正确实施,可以多次处置对象而不会造成伤害。
答案 2 :(得分:2)
可以在一个对象上多次调用Dispose()导致崩溃吗?
是
在一个对象上多次调用Dispose()总会导致崩溃吗?
没有
基本上,它完全取决于实施。对象实现IDisposable
的事实仅仅意味着它具有Dispose
方法。关于如何实施它的指南很多,但实际上没有绝对的规则。
现在我们问:
确保对
Dispose
对象IDisposable
的多次调用不会抛出异常,导致崩溃或以其他方式破坏内容,这是一种很好的做法吗?
是
每个人都遵循该指南吗?
没有
这实际上是我的问题吗?
*耸肩*这很难说。我们不知道该对象如何具体实现Dispose
。
答案 3 :(得分:1)
BDotA,
通常它不会使你的应用程序崩溃,但你需要考虑moTextEditor的Dispose()方法正在做什么。