4

我选择为BackgroundWorker我目前正在开发的应用程序使用 a 的唯一原因是通过 a 将冗长耗时的浏览WebBrowser从 UI 线程中移开。

但不是WebBrowser.Navigate()访问 UI 吗?

换句话说,我经历了所有这些努力,只是落在了同一个地方(或者更糟!因为我不知道非 UI 线程在访问 UI 控件时会产生什么副作用)。

我很确定我不是第一个想要实现这样的东西的人,所以我的问题是:解决这个问题的可接受的方法是什么?即WebBrowser.Navigate()BackgroundWorker

4

1 回答 1

4

Navigate()不是阻塞调用(参见MSDN 文档中的第一行),但它确实更新了 UI,因此需要从 UI 线程调用。

你有几个选择:

  1. Navigate()通过调用将来自 BackgroundWorker 的调用编组到UIInvoke线程
  2. 不要使用 BackgroundWorker - 只需Navigate()从您的 UI 调用(例如按钮单击事件处理程序)并监听 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
    }
}
于 2012-10-26T07:16:50.827 回答