http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 11990|回复: 5

[咨询站长] 跨线程访问webBrowser的问题

[复制链接]
发表于 2014-8-17 19:08:09 | 显示全部楼层 |阅读模式
1金钱
我写的程序大致功能是,用web控件打开一个网页,然后点击网页内的一个链接,平时用的是web控件的DocumentCompleted事件,
但是感觉DocumentCompleted事件有点慢,因为浏览器完全加载完毕才触发DocumentCompleted事件,我就想有没有其他的事件
比DocumentCompleted提前触发,而且网页内基本功能不影响(就是可以点击想要的那个链接了),我就找到了Navigated这个事件(不知道是否有更合适的事件),我在这个事件里的做法是
判断(webBrowser1.ReadyState == WebBrowserReadyState.Interactive) 如果成立就点击链接  Interactive的状态我查了资料说是“该控件已加载足够的文档以允许有限的用户交互,
比如单击已显示的超链接”  但是当Navigated事件触发后直接去判断(webBrowser1.ReadyState == WebBrowserReadyState.Interactive)是不成立的 就是还没加载到想要的状态,
这时我就想用while死循环去判断
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) //浏览器网址改变后触发
        {
            while (true)
            {
                if (webBrowser1.ReadyState == WebBrowserReadyState.Interactive)
                {
                    HtmlElementCollection co1 = webBrowser1.Document.GetElementsByTagName("a");
                    foreach (HtmlElement item in co1)
                    {
                        if (item.GetAttribute("classname") == "J_LinkBuy tb-iconfont")
                        {
                            item.InvokeMember("click");

                        }
                    }
                    return;
                }
            }



        }
但是这样明显是有问题  程序会卡死  我就创建了一个线程 在线程函数里面执行这些代码  但是在线程函数中执行会出错  错误在这句(webBrowser1.ReadyState == WebBrowserReadyState.Interactive)  提示"指定的转换无效"
我搜索了下这个问题是说web控件是主线程创建的 其他线程不能访问  我就用了委托的方式去做  大致代码如下
delegate void FlushClient();//委托
        Thread t;
        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(CrossThreadFunction);
            t.Start();
        }

        private void CrossThreadFunction()
        {
            FlushClient fc = new FlushClient(ThreadFunction);
            fc.BeginInvoke(null, null);

        }

        private void ThreadFunction()
        {
              线程函数的实现.....                   
        }
但是这样还是不行  错误依旧是
我想知道在线程中如何运行这段代码呢  就是"指定的转换无效"  我想知道如何在线程中正确执行(webBrowser1.ReadyState == WebBrowserReadyState.Interactive)  或者给我个建议用其他
方式尽快的能点击网页内的链接(至少要比DocumentCompleted事件早) 在此先谢谢了!



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-8-17 21:58:54 | 显示全部楼层
WebBrowser.Navigated 事件
在 WebBrowser 控件导航到新文档并开始加载该文档时发生。 .
处理 Navigated 事件,在 WebBrowser 控件完成导航并开始加载新位置上的文档时接收通知。
Refer:http://msdn.microsoft.com/zh-cn/ ... ebbrowser.navigated(v=vs.110).aspx

WebBrowser.DocumentCompleted 事件
在 WebBrowser 控件完成加载文档时发生。
处理 DocumentCompleted 事件,在新文档完成加载时接收通知.
Refer:         http://msdn.microsoft.com/zh-cn/ ... r.documentcompleted(v=vs.110).aspx

WebBrowser载入一个页面,DocumentCompleted事件会执行两次,ReadyState状态分别是Intercative和Complete。
页面含有多个框架页,在每个框架页加载完成时也触发一次DocumentCompleted事件。
回复

使用道具 举报

发表于 2014-8-17 22:00:08 | 显示全部楼层
不小心按了个Ctrl+Enter直接回复了,我本来是想换行的~~
你可以试下在DocumentCompleted判断下当前RedayState状态处理你的动作。
回复

使用道具 举报

 楼主| 发表于 2014-8-18 07:34:57 | 显示全部楼层
水手 发表于 2014-8-17 22:00
不小心按了个Ctrl+Enter直接回复了,我本来是想换行的~~
你可以试下在DocumentCompleted判断下当前RedaySt ...

DocumentCompleted触发的条件是已经加载完成了吧  我要在不是完全加载完成的状态去点击
回复

使用道具 举报

 楼主| 发表于 2014-8-18 08:23:36 | 显示全部楼层
水手 发表于 2014-8-17 21:58
WebBrowser.Navigated 事件
在 WebBrowser 控件导航到新文档并开始加载该文档时发生。 .
处理 Navigated  ...

我在DocumentCompleted事件中判断webBrowser1.ReadyState == WebBrowserReadyState.Interactive根本不能触发  应该是Interactive这个状态在DocumentCompleted事件发生之前
QQ截图20140818081910.jpg
回复

使用道具 举报

发表于 2014-8-18 08:50:17 | 显示全部楼层
WebBrowser是单线程的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-24 16:47

© 2014-2021

快速回复 返回顶部 返回列表