У меня есть IE BHO, который находится в разработке на C#. Предполагается, что пользователь должен что-то сделать, связаться с нашим сервером и загрузить некоторые данные, а затем изменить DOM текущей загруженной веб-страницы с результатами.
Я сталкиваюсь с некоторыми, казалось бы, непреодолимыми проблемами, связанными с правилами разделения и многопоточности COM, а именно, я не могу получить доступ к IE DOMDocument за пределами текущего потока, и я не могу придумать какой-либо способ запустить что-то асинхронно без блокировки до IE, пока он не будет закончен.
Моя первая попытка заключалась в том, что фоновая связь с сервером выполнялась в зависимости от событий: моя программа инициировала связь из события mshtml (например, BeforeNaviagate2 или DocumentComplete) и отправляла результаты из отдельного обработчика событий. срабатывает объект связи с сервером, когда он заканчивает свою работу.
Этот метод отлично работал в быстром симуляторе, который я собрал (всего лишь простое приложение с элементом управления WebBrowser), но в IE он выдавал исключение COM, потому что я пытался изменить DOM страницы через отдельный поток.
Поэтому я попытался сохранить все в одной и той же функции и заставить свой код ждать, пока объект связи с сервером выполнит свою работу с помощью цикла while, например:
int waited = 0;
while (!OurServerCommRequest.ready) {
System.Threading.Thread.Sleep(1);
Application.DoEvents();
waited++;
if (waited > constants.TIMEOUT_OURSERVER_REQUEST) {
log.wL("Timed out");
}
}
Проблема с этим подходом заключается в том, что пока код остается в исходном потоке, он выполняется синхронно с процессом IE, в котором он запущен (в IE8 это один процесс на вкладку - как Google Chrome - кажется) ... поэтому блокировка интерфейс IE, пока моя связь с сервером не завершится.
Первоначально я хотел начать обработку, как только URL-адрес будет доступен (через событие NavigationComplete2), но я обнаружил, что ожидание, когда тег ‹body> станет доступным, если связь с моим сервером завершится до загрузки страницы пользователя, также заблокирует IE — выброс это в бесконечный цикл, в то время как мой код ожидает тела HTML, в то время как страница не может обновить себя, чтобы выполнить вышеупомянутый цикл.
Я думал о том, чтобы переместить все это в javascript страницы фактического пользователя, но кажется, что тем самым я открываю банку червей в борьбе с проблемами безопасности XSS.
Итак... мой вопрос таков: возможно ли асинхронно запускать код в C# IE BHO, сохраняя при этом возможность манипулировать DOM страницы пользователя? Я поспрашивал некоторых друзей, и большинство людей говорят мне, что это маловероятно. Я все еще новичок в COM и C #, пришедший из C/VB.net/JS/AS.
Спасибо!
-Том