【问题标题】:How to WebBrowser.Navigate() from BackgroundWorker?如何从 BackgroundWorker 访问 WebBrowser.Navigate()?
【发布时间】:2012-10-24 20:07:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • Navigate() 不是阻塞调用。
  • @SLaks 你是什么意思?我实际上可以看到,在(缓慢)加载网站页面时,表单的按钮和 UI 没有响应。这是从worker_DoWork(object sender, DoWorkEventArgs e) 调用WebBrowser.Navigate()
  • @ateiob BackgroundWorker 的评论特别指出'您必须小心不要在 DoWork 事件处理程序中操纵任何用户界面对象。相反,通过 BackgroundWorker 事件与用户界面进行通信。'
  • @Munchies 这正是我在 OP 中提出的问题:如何“通过 BackgroundWorker 事件与用户界面通信”?跨度>
  • @ateiob 你想发生什么?您通常会在 ProgressChanged 或 RunWorkerCompleted 事件处理程序中与 UI 交互。我不知道您为什么要尝试将后台工作人员用于单个方法调用。

标签: c# winforms webbrowser-control backgroundworker


【解决方案1】:

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

你有几个选择:

  1. 通过 Invoke 调用将 Navigate() 调用从 BackgroundWorker 编组到 UI 线程
  2. 不要使用 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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多