C# “C”;“无效卡斯特例外”;尝试从TimerCallback访问webbrowser控件时

C# “C”;“无效卡斯特例外”;尝试从TimerCallback访问webbrowser控件时,c#,browser,C#,Browser,基本上我和这个用户有相同的问题: 我使用提供的第一个解决方案解决了这个问题。但是,当调用计时器时,我想在webbrowser控件上调用InvokeScript。InvokeScript运行时没有错误,但从未调用javascript函数。当我像单击按钮的事件处理程序一样从中调用此脚本时,函数被正确调用 我发现,当我试图从webbrowser控件访问属性时(比如MessageBox.Show(webBrowser1.DocumentText),会抛出一个InvalidCastException //

基本上我和这个用户有相同的问题: 我使用提供的第一个解决方案解决了这个问题。但是,当调用计时器时,我想在webbrowser控件上调用InvokeScript。InvokeScript运行时没有错误,但从未调用javascript函数。当我像单击按钮的事件处理程序一样从中调用此脚本时,函数被正确调用

我发现,当我试图从webbrowser控件访问属性时(比如MessageBox.Show(webBrowser1.DocumentText),会抛出一个InvalidCastException

// in constructor:
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = this;
timer = new System.Threading.Timer(this.TimerElapsed);     

private void trackBar2_ValueChanged(object sender, EventArgs e)
{
        timer.Change(500, -1);
}
private void TimerElapsed(object state)
{
    this.webBrowser1.InvokeScript("jmp_end");
    MessageBox.Show(this.webBrowser1.DocumentText);
    timerRunning = false;
}
private void TimerElapsed(object state)
{
    WebBrowser brw = getBrowser();
    brw.Document.InvokeScript("jmpend");
    MessageBox.Show(brw.DocumentText);
    timerRunning = false;
}
有人知道我做错了什么吗?或者有其他方法可以得到同样的结果吗

在对InvokeRequired进行评论之后,这听起来和我需要的完全一样..但是我无法让它工作..这是我从

我错过了什么?

调用方(计时器)与创建控件的线程不同


应该解决您的问题的示例代码发布在这个问题上:

我也有同样的问题。正如Kevin p.Rice所指出的,调用方的线程与创建控件的线程不同。一个简单的解决方案是使用
this.Invoke()
每当线程需要与控件交互时,因此,如果您希望浏览器调用脚本,并且希望从单独的线程中调用脚本,请按如下方式执行:

this.Invoke(new Action(() => { brw.Document.InvokeScript("jmpend"); }));
或者,如果您希望更改表单中浏览或其他控件的属性:

this.Invoke(new Action(() => { button1.Enabled = false; }));
如果线程的声明不在表单的声明范围内,并且不能使用
this
关键字,则需要找到引用表单当前实例的方法


我希望这能有所帮助。

请参阅:使用System.Windows.Forms.Timer避免挑战IE以线程安全的方式提供属性。我添加了一些代码来澄清我的问题。对不起,我不清楚。希望有人能看到我错过了什么。提前感谢。您是否已将计时器放置在Visual Studio designer中的windows窗体上?仔细阅读此处的“备注”:另外,您正在停止事件处理程序中的计时器。您可能希望在计时器设置中使用
AutoReset=false
。不,它是System.Threading.timer,没有AutoReset属性。timerRunning是一个布尔值,技术上与计时器本身无关。
this.Invoke(new Action(() => { button1.Enabled = false; }));