BackgroundWorker和webBrowser - 指定的强制转换无效

时间:2013-11-18 21:38:44

标签: c# winforms

我有以下代码:

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应用程序连续工作?

2 个答案:

答案 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);
                }                    
         });
     }