2011-08-11 42 views
0

我遇到了以下问题: 我想在后台下载带有WebBrowser控件(WPF)的网站,然后解析网站。下载应该是一个“紧密的循环”。我不需要显示该页面。我只需要HTML源代码作为字符串。问题在于,该网站在加载后动态地使用JavaScript添加内容,这就是为什么我使用这种方法。 这实际上应该与几个网站同时工作。WPF TPL WebBrowser控制错误:调用线程必须是STA

在我的下面的代码中有错误:“调用线程必须是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); 

UPDATE

我试图像这样与StaTaskScheduler仍然没有得到UI更新任何DEAS在我的错误是和postes它在一个额外的线程

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

谢谢!

+0

我不想给出“答案”,因为这不是我的区域。也许你需要调度你的LoadedCompleted内容。我从来没有使用Task或WebBrowser,所以它只是一个猜测:)另一种在Background中加载某些内容的方式也是WPF方式,那就是使用BackgroundWorker。 – dowhilefor

+0

谢谢你的回答。在这种情况下,TPL应取代Backgroundworker等。 我在WebBrowser获得错误消息wb2 = new WebBrowser(); – user774326

回答

0

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

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

+0

谢谢你的快速回答。 STAThreadScheduler我从来没有听说过...我是一个初学者... 您的第一句话是否意味着它已经做了我想要它做的事情,而无需添加TPL代码?该控件不需要在UI线程上执行任何操作。我稍后将解析内容添加到网格中。它只是在不中断任何其他活动的情况下在后台工作 – user774326

+0

正确。 'WebBrowser'将在后台下载网页,并在完成时引发'LoadCompleted'事件。除非'WebBrowser'在UI线程上执行了很多脚本代码(我不知道它是否会或者脚本代码是否会在后台运行),否则TPL不应该是必需的。 –

+0

谢谢,我还有两个额外的问题:我必须将控制添加到StackPanel或类似的东西,以使其工作。所以如果我需要20个WebSites,我必须添加20个控件。我是否必须将其添加到XAML代码中,或者有办法解决它。 第二个是:我可以在下载时阻止某些图像或类似的东西,以加快进程。在我的情况下,有时需要很长时间直到整个网站加载,但我不需要整个网站。预先感谢您 – user774326

相关问题