如何从BackgroundWorker WebBrowser.Navigate()?

时间:2012-10-24 20:07:06

标签: c# winforms webbrowser-control backgroundworker

我选择使用BackgroundWorker作为我正在开发的应用程序的唯一原因是通过WebBrowser远离UI线程来进行漫长的耗时浏览。

但是WebBrowser.Navigate()访问用户界面不是吗?

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

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

1 个答案:

答案 0 :(得分:3)

Navigate()不是阻塞调用(请参阅MSDN docs中的第一行),但它会更新UI,因此需要从UI线程调用它。

您有几个选择:

  1. 通过Navigate()调用
  2. 对来自BackgroundWorker的UI线程进行Invoke调用
  3. 不要使用BackgroundWorker - 只需从您的UI调用Navigate()(例如按钮单击事件处理程序)并侦听WebBrowser DocumentCompleted事件。
  4. 有关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
        }
    }