受不了,webBrowser 加载网页,为何巨慢,导致程序假死

phuai007 2011-11-08 02:29:10
用ie直接打开是非常快的,但是用webBrowser打开就巨慢,就像死了一样,什么原因,怎么解决?

for (Int32 i = 1; i <= xhcs; i++)
{

String html = getHtml(url);//得到源码
String lists = regurl(html, regstr);//得到帖子列表
String[] arr = lists.Split(',');
foreach (String k in arr.Skip(3)) //跳过置顶帖子
{
webBrowser.Visible = true;
webBrowser.Navigate(web + k.ToString(), false);
// webBrowser.Navigate("http://www.im286.com/thread-8393716-1-1.html", false);//这里一定要flase才行
while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
{
//MessageBox.Show("网页还没加载完");
label10.Text = "正在打开目标网页...";
label10.Refresh();
}
//网页加载完毕,回帖
HtmlDocument htmlDoc = webBrowser.Document;
HtmlElement input = htmlDoc.All["fastpostmessage"];
HtmlElement submit = htmlDoc.All["fastpostsubmit"];
if (input != null)
{
//MessageBox.Show("找到控件了");
input.InnerHtml = posttext;
submit.InvokeMember("click");
DateTime sj = DateTime.Now;
label10.Text = sj + " 发布成功了";
label10.Refresh();
Thread.Sleep(htjg);//回1帖以后暂停时间
}
else
{
//没有找到文本输入框
MessageBox.Show("没有找到文本输入框,可能的原因为:\n\n1、目标帖子不存在;\n\n2、你没有登录或者ie没有保存登录状态;\n\n3、你登录的帐号在当前设置板块没有回帖权限。");
//return;
label10.Text = "发布失败,请检查原因";
label10.Refresh();
}

}
label10.Text = " 一轮发完了,正在进行" + mljg + "间隔,无需操作";
label10.Refresh();
Thread.Sleep(mljg * 60 * 1000);//每一轮完成后暂停时间
}


测试发现,程序就一直在
while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
{
//MessageBox.Show("网页还没加载完");
label10.Text = "正在打开目标网页...";
label10.Refresh();
}

这里面运行,都成死循环了,程序也是假死状态,如何解决?
...全文
710 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2011-11-08
  • 打赏
  • 举报
回复
while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
{
//MessageBox.Show("网页还没加载完");
label10.Text = "正在打开目标网页...";
Application.Doevent();
}
卧_槽 2011-11-08
  • 打赏
  • 举报
回复
你应该把回帖部分写在documnetcompleted方法里面。
phuai007 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yuwenge 的回复:]
while判断抢占了cpu资源,导致webbrowers无法运行。不是webbrowers导致程序假死,而是你的while导致的。
[/Quote]

嗯,我加了一个延时方法进去,这个问题解决了,不过发帖完以后的暂停还是导致程序假死,2楼说的没错,在主线程里操作始终不是好办法,我现在正在改成双线程。

延时代码:


private void Delay(int Millisecond) //延迟系统时间,但系统又能同时能执行其它任务;
{

DateTime current = DateTime.Now;

while (current.AddMilliseconds(Millisecond) > DateTime.Now)
{

Application.DoEvents();//转让控制权

}

return;

}
卧_槽 2011-11-08
  • 打赏
  • 举报
回复
while判断抢占了cpu资源,导致webbrowers无法运行。不是webbrowers导致程序假死,而是你的while导致的。
phuai007 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 assky124 的回复:]
把While去掉啊

用个background检查有没加载完,不要在主线程中处理
[/Quote]

麻烦说详细一些,谢谢
assky124 2011-11-08
  • 打赏
  • 举报
回复
还有你While的时候最好休息个几毫秒,别一直占着CPU
assky124 2011-11-08
  • 打赏
  • 举报
回复
把While去掉啊

用个background检查有没加载完,不要在主线程中处理

110,571

社区成员

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

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

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