C# &引用;指定的强制转换无效";错误
我使用这段代码是为了检查webBrowser1中的文本,尽管我得到的错误是“指定的强制转换无效”。对于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
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异常吗?显然,是的。查看此问题中的堆栈跟踪: