C# Web浏览器多线程强制转换异常

C# Web浏览器多线程强制转换异常,c#,multithreading,browser,C#,Multithreading,Browser,到目前为止,我有一个单线程应用程序,可以对网站进行爬网。 因为我想让它更快,我试着重建一个多线程的应用程序。 我就是这么做的: 我有一个爬行类,它包含一个WebBrowser对象。 以下是我启动线程的方式: Crawler c1 = new Crawler(); Thread t1 = new Thread(new ThreadStart(c1.Crawl)); t1.SetApartmentState(ApartmentState.STA); t1.start() 线程到达此

到目前为止,我有一个单线程应用程序,可以对网站进行爬网。
因为我想让它更快,我试着重建一个多线程的应用程序。 我就是这么做的:
我有一个爬行类,它包含一个WebBrowser对象。 以下是我启动线程的方式:

 Crawler c1 = new Crawler();  
 Thread t1 = new Thread(new ThreadStart(c1.Crawl));  
 t1.SetApartmentState(ApartmentState.STA);
 t1.start()
线程到达此函数:

 LogIn(bool isInit)  
 {  
   browser = new WebBrowser();
   NavigateAndWaitForLoad(browser, "http://www.someurl.com", 1000);
   HtmlElement elemEmail = (HtmlElement)browser.Document.GetElementById("email");  
  }



 void NavigateAndWaitForLoad(WebBrowser wb, string link, int waitTime)  
  {  
   wb.Navigate(link);
   int count = 0;
   while (wb.ReadyState != WebBrowserReadyState.Complete)  
   {  
    Thread.Sleep(sleepTimeMiliseconds);
    Application.DoEvents();
    count++;
    if (count > waitTime / sleepTimeMiliseconds)
        break;  
    } 
现在在单线程中,它工作得很好, 但是,在mutlithreded应用程序中,它会在以下行崩溃: HtmlElement elemEmail=(HtmlElement)browser.Document.GetElementById(“电子邮件”)
除了非法铸造
不知道为什么?

请帮助…

您正在使用WebBrowser对象、Application.DoEvents和Thread.Sleep。糟糕,糟糕,糟糕。你在这里自找麻烦

建议:

如果您只是在构建一个网络爬虫,那么只需使用以字符串形式下载网页即可。然后,如果需要将其解析为HTML文档,请使用

这样,您可以避免使用web浏览器UI控件,您可以避免执行Thread.Sleep,您可以避免意外的递归诱导Application.DoEvents

以下是一个示例:

public async void DownloadWebPage(string address)
{
    using(var webClient = new WebClient())
    {
        var webPageContents = await webClient.DownloadStringTaskAsync();

        // Woohoo, we have the contents of the web page. Do anything with it...
        Console.WriteLine(webPageContents);
    }
}

// Usage:
DownloadWebPage("http://www.google.com");

非法铸造?浏览器.Document.GetElementById(“电子邮件”)的实际类型是什么?你能在调试器中查找吗?那么,强制转换应该不会失败,对吧?看一看