我选择使用BackgroundWorker
作为我正在开发的应用程序的唯一原因是通过WebBrowser
远离UI线程来进行漫长的耗时浏览。
但是WebBrowser.Navigate()
访问用户界面不是吗?
换句话说,我经历了所有这些努力,只是落在同一个地方(或更糟糕!因为我不知道非UI线程在访问UI控件时会有什么副作用)。
我很确定我不是第一个想要实现这样的东西的人,所以我的问题是:什么是解决这个问题的可接受的方法?即从WebBrowser.Navigate()
到BackgroundWorker
?
答案 0 :(得分:3)
Navigate()
不是阻塞调用(请参阅MSDN docs中的第一行),但它会更新UI,因此需要从UI线程调用它。
您有几个选择:
Navigate()
调用Invoke
调用
Navigate()
(例如按钮单击事件处理程序)并侦听WebBrowser DocumentCompleted事件。有关1的示例 - 请参阅https://stackoverflow.com/a/1862639/517244
以下是2的代码示例:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void _goButton_Click(object sender, EventArgs e)
{
_webBrowser.Navigate("http://google.com/");
// Non-blocking call - method will return immediately
// and page will load in background
}
private void _webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// Navigation complete, we can now process the document
string html = _webBrowser.Document.Body.InnerHtml;
// If the processing is time-consuming, then you could spin
// off a BackgroundWorker here
}
}