Skip to main content
 首页 » 编程设计

c#之是否可以测试 Web Browser.Document 是否已被处理,这样我就不会一直收到 ObjectDisposedException

2024年01月13日39落叶无声

是否可以测试 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; 
        } 
    }       

请您参考如下方法:

等一下。您问这个问题的事实表明您的设计存在根本缺陷。 为什么要保留一个可能已经被处置的对象? 这就是问题所在。您不应该需要回答“我怎么知道它是否已被处置?”这个问题。如果您有对该对象的引用,那么它还没有被释放。如果您已处置它,那么您应该丢弃对它的所有引用。

相反,如果其他人有一个引用但不知道您已经处置了它,那么您不应该处置它,仍在使用该对象的代码有责任处理它。

您需要的是一个契约(Contract),它描述了谁拥有该对象以及他们何时处置它,然后实现该契约(Contract)。如果这样做,那么您将知道对象是否已被处置,并且异常将指示违反契约(Contract)的错误。

这是我不久前写的一篇关于相关问题的文章:High maintenance