日期:2014-05-18  浏览次数:20889 次

webbrowser多线程请教~分不够可以再给~~
开发环境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,新新,谢谢

------解决方案--------------------
好乱啊。看的不是很明白。

但是多县城不能同事操作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参数获取具体的完成对象。

------解决方案--------------------
注释掉的是方法2,我想通过结束事件来获取结束了,可是不行,一直没有引发“webBrowser1_查询网站

你有给webbrowser挂接事件吗?
C# code
webBrowser1_查询网站1_DocumentCompleted+=webBrowser1_查询网站1_DocumentCompleted