C# 如何从BackgroundWorker导航WebBrowser.Navigate()?

C# 如何从BackgroundWorker导航WebBrowser.Navigate()?,c#,winforms,webbrowser-control,backgroundworker,C#,Winforms,Webbrowser Control,Backgroundworker,我选择在当前开发的应用程序中使用BackgroundWorker的唯一原因是通过WebBrowser将耗时较长的浏览从UI线程移开 但是WebBrowser.Navigate()不是在访问UI吗 换句话说,我经历了所有这些努力,结果却落在了同一个地方(或者更糟!因为我不知道非UI线程在访问UI控件时会有什么副作用) 我很确定我不是第一个想要实现这样的东西的人,所以我的问题是:什么是可以接受的解决这个问题的方法?i、 e.从BackgroundWorker?Navigate()到WebBrowse

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

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

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

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

Navigate()
WebBrowser.Navigate()
不是阻止调用(请参见中的第一行),但它会更新UI,因此需要从UI线程调用它

您有两个选择:

  • 通过
    Invoke
    调用从BackgroundWorker封送
    Navigate()
    调用到UI线程
  • 不要使用BackgroundWorker-只需从UI(例如按钮单击事件处理程序)调用
    Navigate()
    ,并侦听WebBrowser DocumentCompleted事件
  • 有关1的示例,请参见

    下面是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
        }
    }
    

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