是否可以测试是否已经处理了WebBrowser.Document以便我不会继续获取ObjectDisposedException?

Aid*_*anO 1 c# browser dispose

是否可以测试是否已经处理了WebBrowser.Document以便我不会继续获取ObjectDisposedException?

我知道下面的代码可以完成这项工作,但是我更愿意测试文件是否被处理而不是必须抓住它.有什么想法吗?

  private Size GetContentSize()
    {
        try
        {
            if (
                this.webBrowser.Document != null
                &&
                this.webBrowser.Document.Body != null)
            {
                return this.webBrowser.Document.Body.ScrollRectangle.Size;
            }
            else
            {
                return Size.Empty;
            }
        }
        catch (ObjectDisposedException)
        {
            return Size.Empty;
        }
    }      
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 10

坚持一分钟.您提出问题的事实表明您的设计存在根本缺陷.你为什么要坚持一个可能已被处置的物体? 那就是问题所在.您不应该回答"我怎么知道它是否被处置?"这个问题.如果您有对该对象的引用,则它尚未处理.如果你已经处理掉了,那么你应该抛弃你对它的所有引用.

相反,如果其他人有引用并且不知道您已经处理它,那么您不应该处置它,仍然使用该对象的代码有责任处置它.

您需要的是一份合同,描述谁拥有此对象以及何时将其处置,然后实施该合同.如果您这样做,那么您将知道该对象是否已被处置,并且该异常将指示违反合同的错误.

这是我之前写的一篇关于相关问题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/08/high-maintenance.aspx


Han*_*ant 5

WebBrowser.Document的类型是HtmlDocument.它没有Dispose()方法.

更可能的异常来源是WebBrowser本身.它具有您可以使用的IsDisposed属性.但是,我强烈建议你去寻找代码中的错误而不是应用那个bandaid.也许是一个流浪的使用陈述.

  • 找出答案是微不足道的.创建自己的WB派生类并覆盖Dispose(bool)方法.在它上面设置一个断点. (3认同)