我有以下代码:
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应用程序连续工作?
答案 0 :(得分:2)
您正在获取该异常,因为您无法从后台工作程序访问GUI控件;背景工作者通过定义处于不同的角度。
如果您想要执行此类操作,则需要从后台工作人员调用该网站,可能使用HttpClient并将其与您已有的内容进行比较。
答案 1 :(得分:2)
您无法从UI Controls
主题Non-UI
更改BackgroundWorker
您可以使用InvokeRequired
来自MSDN
Gets a value indicating whether the caller must call an invoke method when
making method calls to the control because the caller is on a different
thread than the one the control was created on.
试试这个:
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);
}
});
}