【问题标题】:BackgroundWorker + WebBrowserBackgroundWorker + WebBrowser
【发布时间】:2010-12-28 19:22:14
【问题描述】:

我尝试使用后台工作程序和网络浏览器浏览几个网页。我正在使用这个不起作用的功能。我不确定这里出了什么问题。

我只看到 MessageBox.Show(arr[0]);没有其他的。浏览器也没有变化

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" };
    for (int i = 0; i < 3; i++)
    {
        MessageBox.Show(arr[i]);
        bB_checker.Invoke((EventHandler)delegate { bB_checker.Navigate(arr[i]); });
        while (bB_checker.ReadyState != WebBrowserReadyState.Complete)
        {
            //  System.Threading.Thread.Sleep(100);
            Application.DoEvents();
        }
    }
}

【问题讨论】:

  • 你需要比“不起作用”更具体一点。有例外吗?可以一步步来吗?
  • 您能否详细说明“它不起作用”。例如,您是否收到错误、不正确的输出或没有输出?
  • 是否需要调用委托?我认为 Navigate 是一个异步操作,而且这个方法似乎已经被 GUI 线程调用了。即使它不是异步的,你也只是在等待它。
  • 更多关于发生的事情的信息会很好。它不会导航吗?它会导航然后挂起吗?

标签: c# .net winforms webbrowser-control


【解决方案1】:

在未检查 RunWorkerCompleted 事件处理程序中的 e.Error 属性的情况下,切勿实施 BGW:

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (e.Error != null) MessageBox.Show(e.Error.ToString());
    }

有点神秘的无效强制转换异常是由在工作线程上使用 ReadyState 属性引起的。 WebBrowser 不是线程安全的。查看 this answer 了解在工作线程上创建 WB 的方法。

但是,如果您需要保持浏览器对用户可见,这不是一个好方法。在这种情况下,您将不得不放弃使用线程。不是真正的问题,只需在 DocumentCompleted 事件处理程序中计算数组索引即可。尽管刷新这些网页没有什么意义。

【讨论】:

    【解决方案2】:

    您无法从其 UI 线程外部访问 WebBrowser 控件的属性。请记住,属性实际上是一种方法,因此您必须使用 Invoke 来调用 Navigate。

    Application.DoEvents() 不一定(而且我不确定是否会工作),因为后台工作线程运行在与您的 UI 线程不同的线程上。

    另外,不要轮询 WebBrowser 的状态,而是使用 DocumentCompleted 事件来获取您的异步通知:

     int i = 0;
     string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" };
    
     protected override void OnShown(EventArgs e)
     {
         base.OnShown(e);
         bB_checker.DocumentCompleted += bB_checker_DocumentCompleted;
         bB_checker.Navigate(arr[0]);
     }
    
     void bB_checker_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
     {
         i++;
         if (i < arr.Length)
            bB_checker.Navigate(arr[i]);
     }
    

    【讨论】:

      【解决方案3】:

      确保将 AllowNavigation 属性设置为 True。 见http://dotnetpulse.blogspot.com/2006/07/why-wont-webbrowser-navigate.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多