如题,采用的是三层架构的编码模式,我在UI线程中开启了一个Backgroundworker的异步线程,在DoWork方法中调用了BLL层的方法,里面主要就是通过WebBrowser进行数据采集,现在的主要问题就是WebBrowser进行数据采集时,所在的线程是非UI线程,而到达了BLL层,我又不知道怎样切换到UI线程(如果是UI线程的话,则可以通过this.Invoke()来进行线程切换),请问下大家这种情况应该怎样处理?
关键代码如下:
(1)UI层DoWork方法:
private void bgw51LA_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; if (worker.WorkerSupportsCancellation && worker.CancellationPending) {//如果中途取消了,则返回 e.Cancel = true; return; } else { //调用BLL层方法,获取51LA统计信息 bllFlowStatistics.Get51LAInfo(_51LAUserName, _51LAUserPWD, "verificationCode", flowStatisticsInfo); } }
(2)BLL层采集方法:
public int Get51LAInfo(string userName, string userPWD, string verificationCode, FlowStatisticsInfo flowStatisticsInfo) { this.tempFlowStatisticsInfo = flowStatisticsInfo; //获取引用地址,通过指向同一空间实现赋值 //通过WebBrowser加载页面,在加载完成后,在页面加载完成事件方法中模拟登录,并且跳转到相应页面截取信息 this.NavigateUrl(http://www.51.la/); while (_51LAFlag == 0) //循环直到标记发生改变(登录信息错误,获取信息超时,或者信息获取完毕后)才返回 { System.Threading.Thread.Sleep(500); } return _51LAFlag; //返回标记信息 }
private void wb51LA_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {//如果状态还没达到Complete,则直接返回,因为加载页面时可能是iframe的页面加载成功,ajax的局部刷新都会触发该事件 if (wb51LA.ReadyState < WebBrowserReadyState.Complete) return;
......
}
}
下面就是出错代码,不知道如何切换到UI线程,然后再对WebBrowser进行导航
public delegate void DelUserHandler(string url); public void NavigateUrl(string url) { if (this.wb51LA.InvokeRequired) { DelUserHandler handler = new DelUserHandler(NavigateUrl); wb51LA.Invoke(new DelUserHandler(NavigateUrl) , url); //this.Invoke(handler, url); } else { this.wb51LA.Navigate(url); } }
异常显示:
有谁线程和WebBrowser比较熟的,赐教一下,谢谢,之前以为是线程STA和MTA的问题,试过了也不行,或者大家有其它思路的话也提供一下,谢谢!
数据采集使用webhttprequest类来处理,而不是用webbrower控件来处理
webhttprequest获得的是目标网站的html代码,这样就可以进行文本处理了(数据就采集回来了)
但我还要做一些模拟登录页面,登录完后再跳转到相应的页面采集,webhttprequest我不是很熟,用WebBrowser不能实现吗?
@诺ヾ誩.: 你的思路就不对,不熟看看api就会了的