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(“电子邮件”)的实际类型是什么?你能在调试器中查找吗?那么,强制转换应该不会失败,对吧?看一看