如何跨线程访问 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事件早) 在此先谢谢了!