BackgroundWorker + WebBrowser - PullRequest
       2

BackgroundWorker + WebBrowser

0 голосов
/ 28 декабря 2010

Я пытался перемещаться по паре веб-страниц, используя фоновый рабочий и браузер Я использую эту функцию, которая не работает. Я не уверен, что здесь происходит не так.

Я вижу только 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();
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 28 декабря 2010

Никогда не реализуйте BGW без проверки свойства e.Error в обработчике событий RunWorkerCompleted:

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

Несколько загадочное недопустимое исключение приведения вызвано использованием свойства ReadyState в рабочем потоке.WebBrowser не является потокобезопасным.Проверьте этот ответ , чтобы узнать, как создать WB в рабочем потоке.

Однако это не очень хороший способ, если вам нужно, чтобы браузер оставался видимым для пользователя.В этом случае вам придется отказаться от использования потоков.Не реальная проблема, просто посчитайте индекс массива в обработчике событий DocumentCompleted.Хотя нет смысла прошивать эти веб-страницы.

1 голос
/ 28 декабря 2010

Вы не можете получить доступ к свойству элемента управления WebBrowser за пределами его потока пользовательского интерфейса.Помните, что свойство является методом под прикрытием, поэтому по той же причине вы должны использовать Invoke для вызова Navigate.

Application.DoEvents () не обязательно (и я не уверен, что дажеработа), поскольку фоновый работник работает в потоке, отличном от потока вашего пользовательского интерфейса.

Кроме того, вместо опроса состояния веб-браузера, используйте событие 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]);
 }
0 голосов
/ 28 декабря 2010

Убедитесь, что для свойства AllowNavigation установлено значение True.Смотри http://dotnetpulse.blogspot.com/2006/07/why-wont-webbrowser-navigate.html

...