WebBrowser多线程带来的麻烦
我们在做采集软件的时候
有些网站通过直接分析html文本是很麻烦的事情
在利用WinForm编程的情况下
有一种更好的方式当然是分析HtmlDocument
然而,这HtmlDoucment并不能直接创建
它必须由 WebBroswer控件Navigate生成一个页面后
才能取得wb.HtmlDocument
然后就可以对HtmlDocument的各元素、标签进行分析。
事实上,在采集的时候
并不是采集只会采集单个页面
这样的话,在主窗体中就可以完成
譬如采集一些列表页面,有N多个页
那么,一个循环下去,
用WebBrowser去响应,那就会导致假死
这时候,我们肯定会想到用多线程去做这件事情
C#的多线程,
大家应该都知道,有STA,MTA两种模式
然而,WebBrowser控件却有一个不好的特点
那就是:它只支持多线程STA模式
例如下面的代码,
Thread tread = new Thread(new ParameterizedThreadStart(BeginCatch));
tread.SetApartmentState(ApartmentState.STA);
tread.Start(url);
tread.SetApartmentState(ApartmentState.STA);
tread.Start(url);
代码
private void BeginCatch(object obj)
{
string url = obj.ToString();
WebBrowser wb = new WebBrowser();
wb.ScriptErrorsSuppressed = true;
wb.Navigate(url);
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
}
{
string url = obj.ToString();
WebBrowser wb = new WebBrowser();
wb.ScriptErrorsSuppressed = true;
wb.Navigate(url);
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
}
需要分析WebBrowser产生 的HtmlDocument时,必须在事件DocumentCompleted里面去操作
只有这时候,WebBrowser才算加载完成
不过,这只是一个陷阱!!!!
WebBrowser有一个特性,那就是在多线程STA的时候,根本就不等到DocumentCompleted的执行
也就是无法再进行后面的操作!!!
这样的话,我们该如何办呢?
也许有人会想:wb.Document.Write(string)方法,如下:
代码
private void BeginCatch(object obj)
{
string url = obj.ToString();
WebBrowser wb = new WebBrowser();
wb.ScriptErrorsSuppressed = true;
{
string url = obj.ToString();
WebBrowser wb = new WebBrowser();
wb.ScriptErrorsSuppressed = true;
string htmlcode = GetHtmlSource(url);
wb.Document.Write(htmlcode);
//执行分析操作
}
//WebClient取网页源码
private string GetHtmlSource(string Url)
{
string text1 = "";
try
{
System.Net.WebClient wc = new WebClient();
text1 = wc.DownloadString(Url);
}
catch (Exception exception1)
{}
r
wb.Document.Write(htmlcode);
//执行分析操作
}
//WebClient取网页源码
private string GetHtmlSource(string Url)
{
string text1 = "";
try
{
System.Net.WebClient wc = new WebClient();
text1 = wc.DownloadString(Url);
}
catch (Exception exception1)
{}
r
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,
部分文章来自网络,