c# - 如何从 BackgroundWorker 调用 WebBrowser.Navigate()?

标签 c# winforms webbrowser-control backgroundworker

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

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

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

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

最佳答案

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

你有几个选择:

  1. 通过 Invoke 调用将来自 BackgroundWorker 的 Navigate() 调用编码到 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
    }
}

关于c# - 如何从 BackgroundWorker 调用 WebBrowser.Navigate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056868/

相关文章:

c# - 由于引用 .net 程序集,无法创建程序集

c# - 如何编辑 “ComboBoxItem”?

java - 将一些 Java 转换为 C#

c# - 如何从当前鼠标光标位置开始窗体的 StartPosition?

.net - 当包含的控件太大时,如何使滚动条显示在可调整大小的面板中?

c# - 查找所有 Func 委托(delegate)

c# - 将一个方法作为参数传递给另一个方法

vb.net - WebBrowser 控件和 cookie

delphi - 如何防止delphi TWebBrowser窃取焦点

C# WebBrowser 控件代理