首页 新闻 会员 周边 捐助

请问大家,如何在非UI线程下使用WebBrowser控件进行数据采集?

0
悬赏园豆:20 [已解决问题] 解决于 2013-01-28 11:47

如题,采用的是三层架构的编码模式,我在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的问题,试过了也不行,或者大家有其它思路的话也提供一下,谢谢!

诺ヾ誩.的主页 诺ヾ誩. | 初学一级 | 园豆:8
提问于:2012-11-12 21:57
< >
分享
最佳答案
0

数据采集使用webhttprequest类来处理,而不是用webbrower控件来处理

webhttprequest获得的是目标网站的html代码,这样就可以进行文本处理了(数据就采集回来了)

收获园豆:20
az235 | 大侠五级 |园豆:8483 | 2012-11-12 23:36

但我还要做一些模拟登录页面,登录完后再跳转到相应的页面采集,webhttprequest我不是很熟,用WebBrowser不能实现吗?

诺ヾ誩. | 园豆:8 (初学一级) | 2012-11-13 12:31

@诺ヾ誩.: 你的思路就不对,不熟看看api就会了的

az235 | 园豆:8483 (大侠五级) | 2012-11-13 13:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册