User 13204940 Ответов: 1

Элементы управления Webbrowser в отдельных потоках


Привет,

Я работаю над проектом, в котором несколько веб-браузеров создаются в отдельных классах, и в них запускается новый поток, который выполняет некоторую навигацию с помощью веб-браузера и сообщает о результатах, устанавливая подэлементы ListViewItem, переданные классу.

Мне нужно создать новый веб-браузер несколько раз, и каждый из них будет работать в другом потоке пользовательского интерфейса, чтобы избежать замораживания пользовательского интерфейса. Если я не установлю режим квартиры потока в STA, я получу ошибку:
System.Threading.ThreadStateException: 'ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.'

Если я это сделаю, то все равно не смогу получить доступ к элементам пользовательского интерфейса из этого потока, даже с помощью методов делегирования, таких как;
Private main As Main
    Private item As ListViewItem

    Public Sub New(main As Main, ByRef item As ListViewItem, ip As String, set_provisioning_string As Boolean)
        Me.main = main
        Me.item = item

        Dim t As New Threading.Thread(AddressOf go)
        t.Start(New Object() {ip, set_provisioning_string})
    End Sub

    Private Sub go(o As Object)
...
Main.set_subitem_text(item, 4, "Checking something...")
...
Private Delegate Sub set_subitem_text_delegate(ByRef item As ListViewItem, index As Integer, text As String)

   Public Sub set_subitem_text(ByRef item As ListViewItem, index As Integer, text As String)
       If InvokeRequired Then
           Invoke(New set_subitem_text_delegate(AddressOf set_subitem_text), item, index, text)
       Else
           item.SubItems(index).Text = text
       End If
   End Sub


Итак, есть ли способ создать поток с выделенным веб-браузером, где этот поток может получить доступ к элементам пользовательского интерфейса?

Что я уже пробовал:

ApartmentMode ста
Не ста
Использование делегатов
Не используя делегатов

Dave Kreskowiak

Windows Forms или WPF?

[no name]

Windows Forms

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Вы не можете создавать отдельные потоки для элементов управления WebBrowser. Это просто не сработает.

Вы можете создать свои потоки для этих элементов управления, но каждый поток должен создать свою собственную форму с элементом управления WebBrowser на нем. Контроль не будет работать без формы.

Для чего вы используете элементы управления WebBrowser? Похоже, что вы просто используете их для выполнения веб-скрейпинга, чтобы получить некоторые данные для размещения в ListView. Использование элемента управления WebBrowser-это немного перебор, что-то вроде этого.