BackgroundWorker + WebBrowser

时间:2010-12-28 19:22:15

标签: c# .net winforms webbrowser-control

我尝试使用backgroundworker&amp ;;浏览几个网页。网页浏览器。我使用这个功能,它不起作用。我不知道这里出了什么问题。

我只看到MessageBox.Show(arr [0]);没有其他的。 webbrowser也不会改变

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();
        }
    }
}

3 个答案:

答案 0 :(得分:4)

在不检查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事件处理程序中计算数组索引。尽管闪存这些网页毫无意义。

答案 1 :(得分:1)

您无法从其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]);
 }

答案 2 :(得分:0)

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