【发布时间】:2011-08-11 17:30:17
【问题描述】:
我遇到了以下问题: 我想在后台下载一个带有 WebBrowser Control (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 Extension) and WebBrowser Control WPF - Wrong Thread
谢谢!
【问题讨论】:
-
我不想给出“答案”,因为这不是我的领域。也许您需要调度您的 LoadedCompleted 内容。我从未使用过 Task 或 WebBrowser,所以这只是一个猜测 :) 在后台加载内容的另一种方法,也是 WPF 方式,是使用 BackgroundWorker。
-
感谢您的回答。在这种情况下,TPL 应该替换 Backgroundworker 等。我在 WebBrowser wb2 = new WebBrowser(); 处收到错误消息
标签: c# wpf multithreading browser task-parallel-library