2009-12-09 1 views
20

VS2008, .NET 2, VB.NET, XP ...Почему ошибка RaceOnRCWCleanup при закрытии формы с помощью элемента управления WebBrowser?

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

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

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

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

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

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

Любые идеи a) почему ошибка, и б) как предотвратить или подавить ее?

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

ответ

30

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

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


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

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

private void CancelButton_Click(object sender, EventArgs e) { 
     this.BeginInvoke((MethodInvoker)delegate { this.Close(); }); 
    } 
+2

Нет, все это происходит на переднем плане. Это не факт, что это происходит совсем, что меня беспокоит - есть способы отключить их в VS.Это факт, что если обработчик Close-события вызывается нажатием кнопки «Закрыть», это не происходит *, но если один и тот же обработчик вызывается нажатием ESC (так как кнопка «Закрыть» является свойством кнопки «Отмена формы»), она * делает *. Почему разница? – ChrisA

+2

Я вижу этот точный сценарий .. для меня это не проблема, потому что я ХОЧУ закрыть форму с помощью веб-браузера. Я хотел бы понять, почему существует разница между нажатием ESC и нажатием кнопки «X». – mpeterson

+0

@chris, @mpeterson - получил репродукцию и решение, сообщение обновлено. –

 Смежные вопросы

  • Нет связанных вопросов^_^