WPF TPL WebBrowser控制错误:调用线程必须是STA

本文关键字:线程 STA 调用 TPL WebBrowser 控制 错误 WPF | 更新日期: 2023-09-27 18:05:10

我有以下问题:我想下载一个网站与web浏览器控制(WPF)在后台和解析网站之后。下载应该是一个"紧密循环"。我不需要显示页面。我只需要HTML源作为字符串。问题是网站在加载后动态添加JavaScript内容,这就是我使用这种方法的原因。这实际上应该同时适用于多个站点。

在我下面的代码中有一个错误:"调用线程必须是STA,因为许多UI组件需要这个"。

我知道如果我将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,但没有得到UI更新任何想法,我的错误是,并在一个额外的线程张贴它

StaTaskScheduler (TPL扩展)和WebBrowser控件WPF -错误线程

谢谢!

WPF TPL WebBrowser控制错误:调用线程必须是STA

WebBrowser已经是异步的,尽管我相信它在UI线程上执行脚本。

如果你想把它分割成一个真正独立的线程,你可以使用STAThreadScheduler。这听起来像你想要一个(STA)线程每个网站。