| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 487 人关注过本帖
标题:如何跨线程访问 web 控件
只看楼主 加入收藏
那就是风
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-1-10
结帖率:66.67%
收藏
 问题点数:0 回复次数:0 
如何跨线程访问 web 控件
我写的程序大致功能是,用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事件早) 在此先谢谢了!
搜索更多相关主题的帖子: 浏览器 如何 而且 网页 
2014-08-18 07:38
快速回复:如何跨线程访问 web 控件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028684 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved