Навигация - это асинхронное действие, и вы даете ему всего 1/10 секунды для завершения, прежде чем вызывать Dispose для объекта веб-браузера. Навигация и клики, вероятно, занимают больше времени, чем это, и поэтому нет веб-браузера, чтобы действовать против ... Вы также «проглатываете» все исключения в обработчике полного документа. Это очень плохая вещь. По крайней мере, вы должны вести там отладочную запись, чтобы помочь себе диагностировать проблему.
Но, чтобы сохранить подобную логику, вы должны создать коллекцию веб-браузеров на уровне класса. Что-то вроде:
private List<WebBrowser> _myWebBrowsers;
Затем добавьте этот список в свой цикл, но не вызывайте Dispose. Вы должны утилизировать браузер, только когда закончили с ним.
Это должно приблизить вас, хотя есть несколько других потенциальных проблем с вашим кодом. Вы выделяете borser-объект и поток для каждого цикла. Это может быстро стать громоздким. Вы должны использовать механизм управления потоками для регулирования этого процесса.
Упрощенный класс:
class WebRunner
{
private List<string> _corruptList = new List<string>();
private List<WebBrowser> _browsers = new List<WebBrowser>();
public void Run()
{
_corruptList.Add("http://google.com");
_corruptList.Add("http://yahoo.com");
_corruptList.Add("http://bing.com");
DoDelete();
Console.ReadKey();
}
public void DoDelete()
{
if (_corruptList.Count < 1) return;
int counter = 1;
foreach (string listItem in _corruptList)
{
WebBrowser webBrowser = new WebBrowser();
_browsers.Add(webBrowser);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBroswer_DocumentCompleted);
webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
webBrowser.Navigate(listItem);
if (counter % 10 == 0) Thread.Sleep(3000); // let app catch up every so often
counter++;
}
}
void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
Console.WriteLine("NAVIGATED: " + e.Url);
}
void webBroswer_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Console.WriteLine("COMPLETED!");
try
{
WebBrowser webBrowser = sender as WebBrowser;
HtmlDocument doc = webBrowser.Document;
var button = doc.Body.Document.GetElementById("button");
button.InvokeMember("Click");
_browsers.Remove(webBrowser);
}
catch (Exception exp)
{
Console.WriteLine(exp.StackTrace);
MessageBox.Show(exp.Message);
}
}
}