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

Я думаю, что неправильно думать об этом с точки зрения AI только. Вещи как зимние AI и коммерческие эффекты на язык Common LISP недовольны, если Вы спрашиваете, почему он использовался для AI, не, почему он не часто используется теперь...

Так или иначе, я думаю, что это - потому что большая часть кода AI была по существу кодом исследования. Lisp является большим языком для исследовательского программирования, для реализации трудных алгоритмов, для самоизменения и часто изменяемого кода. Другими словами, для кода исследования.

я использую шепелявость сегодня для части моего кода исследования (математика, обработка сигналов), потому что это более гибко и мощно, чем большинство языков при тихой генерации более эффективного кода, чем большинство языков. Я могу обычно получать производительность в факторе +,/-2 говорит скорость C++, но я могу реализовать вещи намного быстрее и иметь дело со сложностью, которая взяла бы меня намного больше времени, чем я имею, если я использовал C++, Java, c#.

Это блуждает вне темы все же. Я думаю, что код AI был, прежде всего, записан в языке Common LISP некоторое время, потому что это - мощный подход к коду исследования. Это все еще; но поскольку алгоритмы 'AI' стали лучше понятый и исследуемый, части их было намного легче преподавать и использовать, таким образом, они обнаружились на flavor-of-the-year языках в курсах старшекурсника. Оттуда, это становится проблемой того, что уже знают люди, какие библиотеки доступны, и что работы хорошо для больших групп.

24
задан ChrisA 9 December 2009 в 15:15
поделиться

1 ответ

Это не ошибка, это предупреждение. Создается с помощью помощника по управляемой отладке (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(); });
    }
37
ответ дан 28 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: