Почему возникает ошибка RaceOnRCWCleanup при закрытии формы с элементом управления WebBrowser в ней?

StackOverflow https://stackoverflow.com/questions/1874496

Вопрос

VS2008, .NET 2, VB.NET, XP...

У меня есть форма Windows с элементом управления WebBrowser и кнопкой Закрытия, которая просто выполняет Me.Close.Кнопка отмены формы установлена на кнопку Закрытия, так что я могу нажать ESC, чтобы закрыть форму.

Я установил DocumentText свойство элемента управления WebBrowser в событии загрузки, и отображается HTML-код.

Запустив приложение из Visual Studio, если я нажму кнопку Закрыть, форма закроется без ошибок.

Если я нажму кнопку ESC, я получу

Была обнаружена очистка RaceOnRCWCleanup Сообщение:Была предпринята попытка освободить RCW, который используется.RCW используется в активном потоке или в другом потоке.Попытка освободить используемый RCW может привести к повреждению или потере данных.

Если я запускаю приложение вне VS, я не получаю никакой ошибки.

Есть какие-нибудь идеи: а) почему возникла ошибка и б) как ее предотвратить или подавить?

Заранее большое спасибо.

Это было полезно?

Решение

Это не ошибка, это предупреждение.Создается помощником по управляемой отладке (MDA), расширением к отладчику для управляемого кода, который считает, что в вашем коде что-то идет не так.Обувь подходит по размеру.Вы используете RCW, WebBrowser - это COM-элемент управления.Вы уничтожаете RCW, вы закрываете свою форму.MDA вмешивается, потому что думает, что видит используемый веб-браузер, и он отключается до завершения запроса.Обычно это имело бы смысл только в том случае, если вы используете поток в своем коде.

А ты?Если нет, то не теряйте из-за этого ни капли сна.COM использует подсчет ссылок, печально известный тем, что не может разрешить циклические ссылки.


Хорошо, я получил реплику для этого, включенную комментариями.Да, это вызывается свойством CancelButton формы или свойством DialogResult кнопки.Это происходит, когда WB находится в фокусе, он видит нажатие клавиши Escape.Часть работы ActiveX заключается в том, чтобы сообщить контейнеру об этом, чтобы он мог реагировать на нажатия клавиш, которые должны иметь побочный эффект.Быстрые нажатия клавиш Tab, Enter.И сбежать.Если кнопка затем закрывает форму, отладчик видит, что WB удаляется, пока в стеке есть активные кадры стека из кода RCW.Опасность заключается в том, что это может вызвать сбой при возврате вызываемого кода с момента выпуска COM-компонента, что не редкость.

Увидеть этот сбой довольно маловероятно, но я могу себе представить, что это может привести к взрыву, когда поток финализатора запускается непосредственно перед возвращением события нажатия кнопки.Обходной путь для MDA и потенциального сбоя заключается в том, чтобы отложить закрытие формы до тех пор, пока код ActiveX не перестанет выполняться.Элегантно сделано с помощью элемента управления.BeginInvoke().Вот так:

    private void CancelButton_Click(object sender, EventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top