可以在一个对象上多次调用Dispose()会导致崩溃吗?

时间:2012-11-20 19:49:21

标签: c# winforms crash

我正在调查我的应用程序中的零星崩溃,但仍然不确定是什么导致它。当我想要关闭包含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(); 行重复了两次?你怎么看?这可能是问题吗?

4 个答案:

答案 0 :(得分:6)

IDisposable interfaceDispose文档具体说明:

  

如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用。如果多次调用Dispose方法,则该对象不得抛出异常。除了Dispose之外的实例方法可以在已经处理资源时抛出ObjectDisposedException。

如果对象正确实现了IDisposable ,这应该不是问题。

话虽如此,并非IDisposable的所有实现都遵循规则。我个人会说该对象有一个错误,如果多次调用Dispose有问题,应该更正。

答案 1 :(得分:2)

重复处理看起来像是一个错误,但通常不应该导致任何问题。

如果正确实施,可以多次处置对象而不会造成伤害。

答案 2 :(得分:2)

  

可以在一个对象上多次调用Dispose()导致崩溃吗?

  

在一个对象上多次调用Dispose()总会导致崩溃吗?

没有

基本上,它完全取决于实施。对象实现IDisposable的事实仅仅意味着它具有Dispose方法。关于如何实施它的指南很多,但实际上没有绝对的规则。

现在我们问:

  

确保对Dispose对象IDisposable的多次调用不会抛出异常,导致崩溃或以其他方式破坏内容,这是一种很好的做法吗?

  

每个人都遵循该指南吗?

没有

  

这实际上是我的问题吗?

*耸肩*这很难说。我们不知道该对象如何具体实现Dispose

答案 3 :(得分:1)

BDotA,

通常它不会使你的应用程序崩溃,但你需要考虑moTextEditor的Dispose()方法正在做什么。