2010-12-28 2 views
0

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

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

Вам нужно быть немного более конкретным, чем «не работает». Есть ли исключение? Можете ли вы пройти через это? – Brook

+0

Можете ли вы уточнить, что «это не работает», пожалуйста. Вы получаете ошибку, неправильный вывод или нет вывода, например? – ChrisF

+0

Вам нужно вызвать делегата? Я думал, что Navigate - это асинхронная операция, и кажется, что этот метод уже вызван потоком GUI. Даже если это не асинхронный режим, вы все равно ждёте его. –

ответ

4

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

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

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

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

+0

+1 например код –

1

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

Приложение.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]); 
} 
Смежные вопросы