webbrowser多线程请教~分不够可以再给~~

xinxin1982 2010-07-21 05:41:03
开发环境vs2010英文版,
为了同时显示好几个不同网页,在form里画了wb1-10,名字为wb1,wb2,....wb10,从控件里拖动出来的,

private void button1_Click(object sender, EventArgs e) //用来触发启动所有线程
{

Thread r1 = new Thread(new ThreadStart(return_1));
r1.IsBackground = true;
r1.SetApartmentState(ApartmentState.STA);

......................r2-r10的同样处理

r1.start();
r2.start();
r3.start();
..
..

}


void return_1()
{
WebBrowser my = webBrowser1_查询网站1;
my.ScriptErrorsSuppressed = true;
my.Navigate("http://第一个网址");
//my
//等待加载完毕
while (my.ReadyState < WebBrowserReadyState.Complete) Application.DoEvents();
//用这个方法有个问题,就是r1-r10都start后,会提示权限问题,貌似跨出了线程了是不是,有个冲突问题,这句可以怎么改呢?
//while (complete_state[0] < 1) { Debug.Print(my.ReadyState.ToString() + "\n"); }
//注释掉的是方法2,我想通过结束事件来获取结束了,可是不行,一直没有引发“webBrowser1_查询网站1_DocumentCompleted”
HtmlElement f = my.Document..................;
do_something();

}

private void webBrowser1_查询网站1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
complete_state[0]++;
Debug.Print("查询网站1:" + complete_state[0].ToString() + "\n");
}



=====================================================================
问题:
1:用while (my.ReadyState < WebBrowserReadyState.Complete) Application.DoEvents();来判断是否加载完毕,单个线程时候可以,r1-r10都启动后,会不定期,不固定的跳出错误,说权限问题,估计WebBrowserReadyState.Complete是个通用变量是不是?还是?这个怎么解决呢?
2:用while (complete_state[0] <1) { Debug.Print(my.ReadyState.ToString() + "\n"); }来判断是否加载完毕,这个不会结束,一直死再循环里面,(通过单步观察,这个加载完了,值就是1,这个没问题,),我这里想拖延时间不管用,用了thread.sleep还是不行,哪位大大可以指点一下?

qq:724339906,新新,谢谢
...全文
480 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wq 2012-08-21
  • 打赏
  • 举报
回复
楼主的问题怎么解决的呢?楼主遇到的权限问题是AccessViolationException吗,我也遇到了同样的问题,求指导~
fengyecsdn 2010-07-22
  • 打赏
  • 举报
回复
不在乎那点分了。 就是表达一下我好失落的心情 嘎嘎,,
xinxin1982 2010-07-22
  • 打赏
  • 举报
回复
偶qq你也知道呢嘛,加qq,我直接开贴再给你分就是了哈,这都是小问题的嘛~表生气哦~
xinxin1982 2010-07-22
  • 打赏
  • 举报
回复
真不是这个意思,他写的那个点醒了偶另一个想法,我把my的也转了过去。同一个事件,然后就可以多线程了。还有问题呢,这次要是分给的少,偶单独给你嘛,这都好说呢。。。这几天都晕晕的。。
gxtiou 2010-07-21
  • 打赏
  • 举报
回复
我一直在弄 webbrowser多线程 你到底问什么问题?
像是多线程死锁问题
xinxin1982 2010-07-21
  • 打赏
  • 举报
回复
呵呵,需要决定需求的,先不说这个哈,你给我说的
WB1.Navigate(....);
WB2.Navigate(....);
WB3.Navigate(....);
WB4.Navigate(....);

这个耗费的时间还是累加的,测试6个学生成绩信息网页时42秒,
我会出错的那个,运气好,最后一个才出错,花的时间一般是3-5秒,这样,
fengyecsdn 2010-07-21
  • 打赏
  • 举报
回复
To 10楼 动态生成控件也没有问题的 只要你的思路清晰,流程明确

先生成对象控件,添加到对象集合里
然后指定动作。 总是善于使用事件 对后台线程与界面UI进行分离。
xinxin1982 2010-07-21
  • 打赏
  • 举报
回复
楼上的大大,偶正在看你前面发的英文代码部分....还没找到重点的..英文不好,正在慢慢啃...

我挂事件了,我是从控件栏拖动出来的,然后双击后,加入了事件的,
如果去掉while (complete_state[0] < 1)这里的判断条件,换做方法1,过一会,"查询网站1_DocumentCompleted"会执行,正常反应
但就是加上这个条件,<1的情况,然后把后面要运行的东西放到while当中去...程序都会假死...然后一直没有反应,,我有监视complete_state[0]的值,一直是0......"查询网站1_DocumentCompleted"就没有执行...是不是我暂停程序的方式不太对?
捷哥1999 2010-07-21
  • 打赏
  • 举报
回复
注释掉的是方法2,我想通过结束事件来获取结束了,可是不行,一直没有引发“webBrowser1_查询网站

你有给webbrowser挂接事件吗?
webBrowser1_查询网站1_DocumentCompleted+=webBrowser1_查询网站1_DocumentCompleted
fengyecsdn 2010-07-21
  • 打赏
  • 举报
回复
completed事件 在一个页面上可能被触发多次, 由于页面可能采用框架或者异步的东西。 所以对completed的判断和检查也是必要的。
xinxin1982 2010-07-21
  • 打赏
  • 举报
回复
呵呵,楼上的说的是,可是,我故意要画出来,而不是生成出来,是因为后面还有别的需要,
迫不得已,开始用后台线程内的开始更新线程外的界面,你说的我先去实验一下,昨晚最开始是用的你说的方式,但是程序会假死,多个wb会拖延时间,所以才想到多线程,可惜这方面我始终没入门.嘿嘿.先谢谢了.我去看看
捷哥1999 2010-07-21
  • 打赏
  • 举报
回复
参考:
源代码下载

效果图,实现了多标签浏览:


友情提醒:必须先注册为网站用户后,才能下载。
fengyecsdn 2010-07-21
  • 打赏
  • 举报
回复
还有一个问题 WB毕竟不是完整的IE 有些复杂的脚本操作难免会出现脚本报错的情况 多个WB容易吧程序卡死。 所以最好是获取一下 DOMdocument然后向页面注入一段JS脚本代码,去替换和屏蔽可能报错造成停止的脚本。
常见的是重写 屏蔽alert 等方法。 如果页面还有特殊脚本 要研究一下,重写 替换掉。
fengyecsdn 2010-07-21
  • 打赏
  • 举报
回复
好乱啊。看的不是很明白。

但是多县城不能同事操作UI界面。
这个是时刻要明确的。
不能让后台线程去更新UI界面上的东西,需要更新可以采用跨线程推送。 MSDN上有们的例子,非常简单。看一下就可以了。

如果你要用WB去显示多个页面,WB内部本身是多线程的,但是它里边已经有了处理,你不用关心。
其实你指定WB去加载页面后,加载动作就是后台的,你不用启动那么多线程啦。
你只要挨个启动就可以

WB1.DocumentCompleted += new new WebBrowserDocumentCompletedEventHandler(WB_OK);
WB1.DocumentCompleted += new new WebBrowserDocumentCompletedEventHandler(WB_OK);
WB1.DocumentCompleted += new new WebBrowserDocumentCompletedEventHandler(WB_OK);
WB1.DocumentCompleted += new new WebBrowserDocumentCompletedEventHandler(WB_OK);


WB1.Navigate(....);
WB2.Navigate(....);
WB3.Navigate(....);
WB4.Navigate(....);


在 WB_OK方法中处理你的完成事物。
其实完成事件你可以用多个方法分别处理。 但是从编程风格上建议用同一个方法 然后通过SENDER参数获取具体的完成对象。
huwen7565833 2010-07-21
  • 打赏
  • 举报
回复
友情帮顶!!
tyy283 2010-07-21
  • 打赏
  • 举报
回复
我也收藏,期待高手
qqzhangmin520 2010-07-21
  • 打赏
  • 举报
回复
我先收藏 期待高手
fengyecsdn 2010-07-21
  • 打赏
  • 举报
回复
楼主太不厚道 你给那人90分 他写的那句话 我早就写了为啥 不给我??
fengyecsdn 2010-07-21
  • 打赏
  • 举报
回复
4.0的线程结束就释放了 没有STOPED了

需要的话 你可以自己设一个变量 线程最后更改它就是了
xinxin1982 2010-07-21
  • 打赏
  • 举报
回复
.net4.0中ThreadState消失了一些属性...郁闷了..

my.threadstate!=Threadstate.Stopped
这个判断不能用了...没有stopped属性了...咋办咧....
加载更多回复(1)

110,536

社区成员

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

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

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