代码之家  ›  专栏  ›  技术社区  ›  AidanO

是否可以测试Webbrowser.document是否已被释放,以便我不继续获取ObjectDisposedException?

  •  1
  • AidanO  · 技术社区  · 14 年前

    是否可以测试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;
            }
        }      
    
    3 回复  |  直到 14 年前
        1
  •  5
  •   Hans Passant    14 年前

    webbrowser.document的类型是htmldocument。它没有Dispose()方法。

    更可能的异常源是WebBrowser本身。它有一个isDisposed属性,您可以使用它。但是,我强烈建议您在代码中查找bug,而不是应用该Bandaid。也许是流浪汉 使用 声明。

        2
  •  10
  •   Eric Lippert    14 年前

    等一下。你问这个问题的事实表明你的设计有一个根本的缺陷。 为什么你要抓住一个可能已经被释放的对象? 这就是问题所在。你不应该 需要 对“我如何知道它是否已被处理”问题的回答。如果您引用了该对象,那么它就没有被释放。如果你已经处理了它,那么你应该扔掉所有对它的引用。

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

    你需要的是 合同 它描述了谁拥有这个对象,以及何时处理它,然后实现那个契约。如果您这样做,那么您将知道对象是否已被处理,并且异常将指示一个违反合同的bug。

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

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

        3
  •  0
  •   shin    14 年前

    当WebBrowser实例不再有效时,将引发ObjectDisposedException。因此,检查文档仍将导致抛出ObjectDisposedException,因为WebBrowser实例已被释放…无论哪种方法,您都应该在代码中包含catch,以确保在检查和返回之间未释放该对象…