Можно ли проверить, был ли удален 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;
        }
    }      

person AidanO    schedule 08.11.2010    source источник


Ответы (3)


Тип WebBrowser.Document — HtmlDocument. У него нет метода Dispose().

Более вероятным источником исключения является сам WebBrowser. У него есть свойство IsDisposed, которое вы можете использовать. Тем не менее, я настоятельно рекомендую вам искать ошибку в коде, а не применять этот пластырь. Возможно, случайный оператор using.

person Hans Passant    schedule 08.11.2010
comment
Спасибо, Ганс, это правильно. Я думал, что, поскольку я мог наблюдать за веб-браузером и поскольку некоторые значения появлялись, его нельзя было удалить. Это, как выясняется, не так. - person AidanO; 08.11.2010
comment
Также верно, что лучшим решением, безусловно, было бы выяснить, почему оно удаляется, и лучше с этим справиться, но я не могу сделать это прямо сейчас. Спасибо - person AidanO; 08.11.2010
comment
Это тривиально узнать. Создайте свой собственный производный класс WB и переопределите метод Dispose(bool). Установите на нем точку останова. - person Hans Passant; 08.11.2010

Подожди минутку. Тот факт, что вы задаете вопрос, указывает на фундаментальный недостаток вашего дизайна. Почему вы держитесь за объект, который, возможно, уже может быть утилизирован? Вот в чем проблема. Вам не требуется ответ на вопрос "как узнать, утилизировано ли оно?" Если у вас есть ссылка на объект, значит, он не был удален. Если вы его утилизировали, то вы должны были выбросить все свои ссылки на него.

И наоборот, если кто-то еще имеет ссылку и не знает, что вы ее удалили, то вам не следовало ее удалять, код, который все еще использует объект, несет ответственность за его удаление.

Что вам нужно, так это контракт, описывающий, кому принадлежит этот объект и когда они будут его утилизировать, а затем реализовать этот контракт. Если вы это сделаете, вы узнаете, был ли объект удален, и исключение укажет на ошибку, которая является нарушением контракта.

Вот статья, которую я написал некоторое время назад по связанной проблеме:

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

person Eric Lippert    schedule 08.11.2010
comment
Спасибо, Эрик, хорошие моменты. Я также рассмотрю рефакторинг кода. - person AidanO; 08.11.2010

Исключение ObjectDisposedException возникает, когда экземпляр WebBrowser больше недействителен. Таким образом, проверка документа по-прежнему будет вызывать исключение ObjectDisposedException, поскольку экземпляр WebBrowser уже удален... В любом случае вы должны иметь Catch в своем коде, чтобы быть уверенным, что объект не был удален между проверкой и возвратом...

person shin    schedule 08.11.2010