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

时间:2011-08-11 17:30:18

标签: c# wpf multithreading browser task-parallel-library

我遇到了以下问题: 我想在后台下载一个带有WebBrowser控件(WPF)的网站,然后解析该网站。下载应该是“紧密循环”。我不需要显示页面。我只需要HTML源代码作为字符串。问题是该网站在加载后动态地添加JavaScript内容,这就是我使用这种方法的原因。 这应该同时适用于多个站点。

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

我知道如果我将TaskScheduler更改为当前上下文,则不会收到任何错误消息。

但是如何在后台下载HTML源代码?

ADDITION 我必须将其添加到例如StackPanel withoud这个添加它不起作用

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更新任何deas我的错误是在一个额外的线程中提出它

StaTaskScheduler (TPL Extension) and WebBrowser Control WPF - Wrong Thread

谢谢!

1 个答案:

答案 0 :(得分:0)

WebBrowser已经异步,但我相信在UI线程上执行脚本。

如果要将其拆分为真正独立的线程,可以使用STAThreadScheduler。听起来你每个网站都需要一个(STA)线程。