C# BackgroundWorker和webBrowser-指定的强制转换无效
我有以下代码:C# BackgroundWorker和webBrowser-指定的强制转换无效,c#,winforms,C#,Winforms,我有以下代码: void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while(true) { try { var table = webBrowser3.Document.GetElementById("emailTable"); var tr = table.GetElementsByTagName("tr");
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while(true)
{
try
{
var table = webBrowser3.Document.GetElementById("emailTable");
var tr = table.GetElementsByTagName("tr");
if (tr.Count > 1)
{
var link = tr[1].GetElementsByTagName("td")[1].GetElementsByTagName("a")[0].GetAttribute("href");
webBrowser3.Navigate(link);
}
}
catch (Exception)
{
//webBrowser3.Document.GetElementById("emailTable"); => Specified cast is not valid
}
Thread.Sleep(1000);
}
}
在我的代码中,我在winform应用程序的webBrowser3
中加载一个网页,然后启动backgroundWorker1
,以捕获对站点所做的任何更改(站点通过ajax向表中添加元素)。不幸的是,它抛出了一个异常
我如何定期检查
webBrowser3.Document
中的更改,并允许winform应用程序连续工作?由于您无法从后台工作人员访问GUI控件,因此您会遇到该异常;根据定义,后台工作人员处于不同的线程上
如果你想做这样的事情,你需要从后台工作人员那里打个电话到该网站,也许可以使用它并将其与你已有的进行比较。你不能从
非UI
线程后台工作人员
更改UI控件
您可以使用invokererequired
从
试试这个:
if(this.webBrowser3.InvokeRequired)
{
Invoke((MethodInvoker)(() => {
var table = webBrowser3.Document.GetElementById("emailTable");
var tr = table.GetElementsByTagName("tr");
if (tr.Count > 1)
{
var link = tr[1].GetElementsByTagName("td")[1].GetElementsByTagName("a")[0].GetAttribute("href");
webBrowser3.Navigate(link);
}
});
}
异常和完整异常消息的确切堆栈跟踪是什么?什么是
webBrowser3
?您如何尝试确定页面是否有更改?您是否将元素/值存储在数据库中,以便与之进行比较?可能的重复项
if(this.webBrowser3.InvokeRequired)
{
Invoke((MethodInvoker)(() => {
var table = webBrowser3.Document.GetElementById("emailTable");
var tr = table.GetElementsByTagName("tr");
if (tr.Count > 1)
{
var link = tr[1].GetElementsByTagName("td")[1].GetElementsByTagName("a")[0].GetAttribute("href");
webBrowser3.Navigate(link);
}
});
}