【问题标题】:Can Calling Dispose() more than one time on an object lead to a crash?对一个对象多次调用 Dispose() 会导致崩溃吗?
【发布时间】:2023-03-04 19:59:02
【问题描述】:

我正在调查我的应用程序中的零星崩溃,但仍不确定是什么原因造成的。当我想关闭包含 VB 6.0 或 VC 6.0 文本控件的 MDI 表单时,有时会发生这种情况——它作为互操作的 C# 包装器。在查看代码时,我注意到我有一些这样的代码:

 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(); 行重复了两次?你怎么看?这可能是问题吗?

【问题讨论】:

  • 你设置断点来检验你的理论了吗?

标签: c# winforms crash


【解决方案1】:

DisposeIDisposable interface 文档特别指出:

如果多次调用对象的 Dispose 方法,则对象必须忽略第一次调用之后的所有调用。如果多次调用其 Dispose 方法,则该对象不得引发异常。当资源已被释放时,除 Dispose 之外的实例方法可能会引发 ObjectDisposedException。

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

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

【讨论】:

    【解决方案2】:

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

    如果实施得当,一个对象可以被多次释放而不会造成伤害。

    【讨论】:

      【解决方案3】:

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

      是的。

      对一个对象多次调用 Dispose() 是否总是会导致崩溃?

      没有。

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

      所以现在我们问:

      确保对我的IDisposable 对象的多次调用Dispose 不会引发异常、导致崩溃或以其他方式破坏内容是否被认为是一种好习惯?

      是的。

      每个人都真正遵循该准则吗?

      没有。

      这真的是我的问题吗?

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

      【讨论】:

      • 不过,它不应该导致崩溃。
      • @ReedCopsey 是的,我到了最后。
      【解决方案4】:

      BDotA,

      一般不会让你的应用程序崩溃,但你需要考虑 moTextEditor 的 Dispose() 方法在做什么。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        相关资源
        最近更新 更多