0

Я пытаюсь использовать кучу веб-браузеров в некоторых фоновых потоках. Это не проблема, когда я использую элементы управления webbrowser, которые я разместил в форме в представлении дизайна, но теперь, когда они создаются во время выполнения.Управление вебером управления веб-браузером из фонового потока vb.net

Я объявляю массив веб-браузером, глобально:

Dim webbroswers(-1) As WebBrowser 

Следующий код на главной теме:

ReDim Preserve webbroswers(somenum) 

    For i = 0 To sumnum 

      webbroswers(currentbrowsermax + i) = New WebBrowser 

    Next 

Затем этот код выполняется на фоне резьбы:

If webbroswers(num).InvokeRequired Then 
    webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl)) 
Else 
    webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl)) 

Программа вылетает с этого момента со следующей ошибкой:

Unable to get the window handle for the 'WebBrowser' control. Windowless ActiveX controls are not supported.

Любая помощь по этому вопросу будет замечательной. Также, если кто-то знает, как подавить ошибки скрипта, я думаю, что это может помочь. Я пробовал: WebBrowser (num) .ScriptErrorsSuppressed = True, но это не сработает (это не работает в другом месте моего кода при запуске в основном потоке) Спасибо!

+0

Я не уверен, что вы собираетесь делать в состоянии, которое вылетает. Также не уверен, почему вы хотите использовать BWG: он предназначен для «действий без GUI», а браузер является элементом GUI (и, следовательно, должен выполняться в основном потоке). Пожалуйста, опишите точные условия, которые вы хотите учитывать. – varocarbas

+0

В основном у меня есть код, который делает вещи с помощью webbroswer. Я хочу сделать это многопоточным, чтобы он мог делать это с помощью нескольких веб-браузеров (указывал на несколько разные адреса) – FraserOfSmeg

+0

Пример, где вы можете использовать BGW: браузер1 подключается к url1 и начинает загрузку; пока вы хотите разрешить пользователям использовать браузер2, чтобы идти куда угодно. То есть, BWG не предназначен для работы с браузером 1 и браузером2 (переход на разные URL-адреса), но для того, чтобы показывать GUI-элемент в то время как дорогие, не GUI-действия выполняются (в этом случае загрузка браузера 1). Если для всего (или большинства) того, что вы хотите сделать, требуется GUI (например: наличие двух браузеров, открытых только для навигации), BWG не требуется. – varocarbas

ответ

1

Элементы Control.InvokeRequired и Invoke используют свойство Handle, чтобы выяснить, какой поток принадлежит элементу управления. Проблема в том, что Handle имеет значение null для созданных веб-браузеров. Элемент управления имеет действительный дескриптор, когда вы сделали его видимым в форме. Которых вы не делали. Затем он попытается создать дескриптор, но это отказоустойчивый кит, элемент управления ActiveX, такой как WebBrowser, нуждается в действительном родителе. Без Me.Control.Add(), как это было сделано в вашей исходной версии, у него его не будет.

Обходной путь прост, вам просто нужен другой элемент управления с действительным свойством Handle. Любой будет делать это, он заботится только о потоке, которому принадлежит дескриптор, а не о значении дескриптора.

У вас есть: Ваша форма. Вместо этого используйте Me.InvokeRequired и Me.Invoke(). Или Application.OpenForms (0), если вы не можете легко получить ссылку на объект формы, лучше избегать.

+0

Отличный ответ. Благодаря! – FraserOfSmeg

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