我选择为我当前正在开发的应用程序使用 BackgroundWorker
的唯一原因是将通过 WebBrowser
进行的冗长耗时的浏览从 UI 线程中移开.
但是 WebBrowser.Navigate()
不是在访问 UI 吗?
换句话说,我经历了所有这些努力,只是落在了同一个地方(或者更糟!因为我不知道非 UI 线程在访问 UI 控件时会产生什么副作用)。
我很确定我不是第一个想要实现这样的东西的人,所以我的问题是:解决这个问题的可接受方法是什么?即从 BackgroundWorker
到 WebBrowser.Navigate()
?
最佳答案
Navigate()
不是阻塞调用(请参阅 MSDN docs 中的第一行),但它会更新 UI,因此需要从 UI 线程调用它。
你有几个选择:
- 通过
Invoke
调用将来自 BackgroundWorker 的Navigate()
调用编码到 UI 线程 - 不要使用 BackgroundWorker - 只需从您的 UI 调用
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
}
}
关于c# - 如何从 BackgroundWorker 调用 WebBrowser.Navigate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056868/