2010-11-08 12 views
1

是否有可能測試WebBrowser.Document是否已被處置,以便我不會收到ObjectDisposedException?是否可以測試一個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; 
     } 
    }  

回答

5

WebBrowser.Document的類型是HtmlDocument。它沒有Dispose()方法。

異常的可能來源是WebBrowser本身。它有一個可以使用的IsDisposed屬性。不過,我強烈建議你在代碼中尋找錯誤,而不是應用該bandaid。也許一個流浪的使用聲明。

+0

感謝漢斯,這是正確的。我認爲,因爲我可以看網頁瀏覽器,並且因爲有些價值顯示它不能被處置。事實證明情況並非如此。 – AidanO 2010-11-08 14:59:59

+0

確實,更好的解決方案當然是找出爲什麼它被更好地處理和處理,但我現在無法做到這一點。謝謝 – AidanO 2010-11-08 15:01:04

+3

找出答案是微不足道的。創建您自己的WB派生類並重寫Dispose(bool)方法。在它上面設置一個斷點。 – 2010-11-08 15:09:26

0

當WebBrowser實例不再有效時,拋出ObjectDisposedException。因此,檢查文檔仍然會導致拋出ObjectDisposedException,因爲WebBrowser實例已經處理完畢......無論哪種方式,您都應該在代碼中使用Catch以確保該對象不會在檢查和返回之間放置...

10

等一會兒。你問這個問題的事實表明你的設計存在一個基本缺陷。 你爲什麼要堅持一個可能已經被處置的物體?這就是問題所在。你不應該需要對「我怎麼知道它是否已經處置?」這個問題的答案。如果你有一個對象的引用,那麼它沒有被處置。如果你已經處理了它,那麼你應該拋棄所有對它的引用。相反,如果其他人有參考,並且不知道你已經處理了它,那麼你不應該處理它,,仍在使用該對象的代碼有責任處置它。

你需要的是一個合同,它描述了誰擁有這個對象,以及他們何時處置它,然後執行該合同。如果你這樣做,那麼你就會知道對象是否已被處置,而異常會指出一個違反合同的錯誤。

這裏有一個文章,我在一個相關的問題寫了一段時間後:

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

+0

謝謝Eric,好點。我也會研究重構代碼。 – AidanO 2010-11-08 15:03:30

相關問題