C# winform(WebBrowser) 多线程问题

lovecooldog 2012-07-17 11:50:37
我要实现的功能是通过WebBrowser加载网页,然后解析这个网页的源码,并生成一个Html dom Tree 显示在TreeView控件上展现给用户。但是现在遇到问题: 一是遇到信息量大的网站解析比较慢,出现假死的情况;二是在解析生成树的过程中如果鼠标操作界面,就会卡死,希望得到大家的帮助。
下面是我实现这个功能的部分代码:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
return;
}
//如果页面加载完成 就执行网页解析操作
parserHtml();

}

//创建线程,进行网页解析并生成htmldomTree,然后domTree显示到界面上
pravate void parserHtml()
{
Thread thread = new Thread(new ThreadStart(createDomTree));
thread.Start();
}

private delegate void delegateUpdateTreeView(TreeNode treeNode);//委托

//实现网页的解析 和domTree的生成
void createDomTree()
{

TreeNode treeNode = parserHtmltoTree();//这个遇到信息量大的网站挺费时间
BeginInvoke(new delegateUpdateTreeView(delegateUpdateTreeViewImpl), treeNode);
}

//更新界面
void delegateUpdateTreeViewImpl(TreeNode treeNode)
{
this.TreeView1.Nodes.Add(treeNode);//把从网页中解析的信息以tree的形式显示到TreeView控件中
Application.DoEvents();
}

补充:界面假死或者卡死在控制台中打印如下异常信息:
A first chance exception of type 'System.UnauthorizedAccessException' occurred in (工程名称)*.exe。在网上找了一些方法,也没有得到解决。

希望得到大家的帮助!
...全文
733 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
木_玉 2013-12-08
  • 打赏
  • 举报
回复
进来学习,最近也在学多线程
redsen 2013-12-08
  • 打赏
  • 举报
回复
引用 10 楼 lovecooldog 的回复:
没有高手能解决 那我再问另一个问题 如何判断webBrowser里页面iframe完全加载完毕 谷歌、百度我都搜遍啦,所有方法都不行 如:1、用计数器count=0,通过事件webBrowser_Navigated和webBrowser_DocumentCompleted对count分别自增和自减 2、在DocumentCompleted事件中判断e.Url和WebBrowser.Document.Url是否一致,如一致则表示初始页面加载完毕 等方法没有一个能解决问题的,因为每加载完成一次iframe就会触发一次 commpleted,遇到iframe多的就要触发很多次,根本无法判断什么时候最终加载完成! 希望高手指点!
每加载完成一次iframe就会触发一次 commpleted,遇到iframe多的就要触发很多次, 1,估计这导致重复解析造成假死。可以在解析时,加一个解析标志。如果解析标志为真,则即使commpleted触发,也不再执行解析。从而避免重复解析。 2,这样可能的问题就是解析的是首次网页内容,iframe中的内容并没有解析。 可能解析的不是最后的页面。 那么,可以加一个延时。如果commpleted触发后,延长一定时间,再来解析。 因为你的解析并不需要这样急,晚一解析出来,不影响其它的操作。
sdsxc 2013-12-06
  • 打赏
  • 举报
回复
isbackground=true; 试试!
lovecooldog 2012-07-20
  • 打赏
  • 举报
回复
没有高手能解决
那我再问另一个问题
如何判断webBrowser里页面iframe完全加载完毕
谷歌、百度我都搜遍啦,所有方法都不行
如:1、用计数器count=0,通过事件webBrowser_Navigated和webBrowser_DocumentCompleted对count分别自增和自减
2、在DocumentCompleted事件中判断e.Url和WebBrowser.Document.Url是否一致,如一致则表示初始页面加载完毕
等方法没有一个能解决问题的,因为每加载完成一次iframe就会触发一次 commpleted,遇到iframe多的就要触发很多次,根本无法判断什么时候最终加载完成!
希望高手指点!
lovecooldog 2012-07-20
  • 打赏
  • 举报
回复
A first chance exception of type 'System.UnauthorizedAccessException' occurred in (工程名称)*.exe。

这个异常已经解决 是跨域的问题!但是其他问题还没有解决,希望得到大家的帮助!
lovecooldog 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

干吗用WebBrowser来解析网页呢。。WebBrowser应该很耗内存吧。。而且还不好释放,为啥不直接用HttpRequest等方式来抓取网页源代码呢?
[/Quote]

首先感谢你的回复
但是后续操作我要用到WebBrowser,不知道有什么好的办法解决!
lovecooldog 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

createDomTree()
里面加Application.DoEvents();
其它的都去掉。
[/Quote]

首先感谢你的回复
你的意思是说去掉cretateDomTree()去掉里面的
TreeNode treeNode = parserHtmltoTree();//这个遇到信息量大的网站挺费时间
BeginInvoke(new delegateUpdateTreeView(delegateUpdateTreeViewImpl), treeNode);两行代码,然后添加上Application.DoEvents();但是我这两句代码放在什么位置呢?
liyifei123 2012-07-18
  • 打赏
  • 举报
回复
createDomTree()
里面加Application.DoEvents();
其它的都去掉。
lwh314375546 2012-07-18
  • 打赏
  • 举报
回复
干吗用WebBrowser来解析网页呢。。WebBrowser应该很耗内存吧。。而且还不好释放,为啥不直接用HttpRequest等方式来抓取网页源代码呢?
lovecooldog 2012-07-18
  • 打赏
  • 举报
回复
没人会吗?
如果能解决!觉得分不够的话,我额外开贴给分!
lovecooldog 2012-07-18
  • 打赏
  • 举报
回复
希望得到大家的帮助!
wy811007 2012-07-18
  • 打赏
  • 举报
回复
mark 学习下 以后可能会用到
lovecooldog 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

createDomTree()
里面加Application.DoEvents();
其它的都去掉。


首先感谢你的回复
你的意思是说去掉cretateDomTree()去掉里面的
TreeNode treeNode = parserHtmltoTree();//这个遇到信息量大的网站挺费时间
BeginInvoke(new delegateUpda……
[/Quote]

你是说 只在cretateDomTree()方法中加Application.DoEvents();
其他地方加的都去掉是吧!但是也不行!

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧