C# &引用;指定的强制转换无效";错误

C# &引用;指定的强制转换无效";错误,c#,winforms,browser,C#,Winforms,Browser,我使用这段代码是为了检查webBrowser1中的文本,尽管我得到的错误是“指定的强制转换无效”。对于string docText=webBrowser1.Document.Body.InnerText。你知道为什么吗?可能是因为我正在从另一个线程访问webBrowser?谢谢 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } privat

我使用这段代码是为了检查webBrowser1中的文本,尽管我得到的错误是“指定的强制转换无效”。对于
string docText=webBrowser1.Document.Body.InnerText。你知道为什么吗?可能是因为我正在从另一个线程访问webBrowser?谢谢

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string docText = webBrowser1.Document.Body.InnerText;

    if (docText == "Hello")
    {
        MessageBox.Show("Alerted!");
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}
我会试试

backgroundWorker1.RunWorkerAsync(webBrowser1.Document.Body.InnerText);
这将删除强制转换异常

还有嫁妆

string docText = e.Argument.ToString();

这将消除UI线程问题

该异常实际上可能是从非主UI线程的线程访问属性引起的。您可以通过在
System.InvalidCastException
的堆栈跟踪中查找以下行来验证:

在System.Windows.Forms.UnsafentiveMethods.IHTMLDocument2.GetLocation()中 在System.Windows.Forms.WebBrowser.get_Document()中

如果是这种情况,请尝试将网页内容作为参数传递给后台线程:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var docText = (string)e.Argument;
}

private void timer1_Tick(object sender, EventArgs e)
{
    var docText = webBrowser1.Document.Body.InnerText;
    backgroundWorker1.RunWorkerAsync(docText);
}

在访问文档之前,您可能应该等待WebBrowser ctrl发出的DocumentCompleted事件。

正文部分将返回一个对象空引用异常,.innerHTML将不会被识别为字符串。如果您没有等待加载页面,它可能会触发您得到的错误。在所有这些之前,您是否正确地等待文档加载?如果您需要帮助,请查看我关于如何正确等待webbrowser控件的答案。

您可以发布异常的堆栈跟踪吗?根据
文档
属性是
对象
,因此您需要在取消引用它之前强制转换它以获得
Body.InnerText
。你遗漏了一些代码吗?@ChrisF这难道不应该让编译器抱怨,而不是在运行代码时导致异常吗?@FredrikMörk-是的,这就是为什么我问OP是否遗漏了他的问题中的一些代码。这会导致InvalidCast异常吗?显然,是的。查看此问题中的堆栈跟踪: