Ошибка управления WPF TPL WebBrowser: вызывающий поток должен быть STA - PullRequest
0 голосов
/ 11 августа 2011

У меня возникла следующая проблема: я хочу загрузить веб-сайт с помощью элемента управления WebBrowser (WPF) в фоновом режиме и впоследствии проанализировать сайт.Загрузка должна быть в "тесной петле".Мне не нужно отображать страницу.Мне нужен только источник HTML в виде строки.Проблема в том, что сайт динамически добавляет контент с помощью JavaScript после загрузки, поэтому я использую этот подход.Это на самом деле должно работать с несколькими сайтами одновременно.

В моем следующем коде есть ошибка: «Вызывающий поток должен быть STA, потому что это требуется для многих компонентов пользовательского интерфейса».

Я знаю, если я изменюсьTaskScheduler в текущем контексте я не получаю сообщение об ошибке.

Но как я могу загрузить исходный HTML-код в фоновом режиме?

ДОБАВЛЕНИЕ Я должен добавить его, например, в StackPanel, но это дополнение не работает

stackpanel.Children.Add(wb2);

Есть идеи?

Заранее спасибо

private void Button1_Click(object sender, RoutedEventArgs e)
        {Task.Factory.StartNew(
                    () =>
                    {
                        WebBrowser wb2 = new WebBrowser();  // That's where I get the error essage
                        wb2.Source = new Uri(MySite);
                        wb2.LoadCompleted += new LoadCompletedEventHandler(wb_LoadCompleted);

                    }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
            }
        }

void wb_LoadCompleted(object sender, NavigationEventArgs e)
        {
            WebBrowser w = sender as WebBrowser;
            HtmlDocument document = new HtmlDocument(w.Document);

ОБНОВЛЕНИЕ

Я попробовал это так со StaTaskSchedulerтем не менее, не получайте обновления пользовательского интерфейса. Любая ошибка, где моя ошибка, и помещает ее в дополнительную ветку

StaTaskScheduler (расширение TPL) и WebBrowser Control WPF - Неверная тема

Спасибо!

1 Ответ

0 голосов
/ 11 августа 2011

WebBrowser уже асинхронен, хотя я верю, что выполнит сценарии в потоке пользовательского интерфейса.

Если вы хотите разделить его на действительно отдельный поток, вы можетеиспользуйте STAThreadScheduler .Похоже, вы хотите одну (STA) нить на каждый веб-сайт.

...