尝试从TimerCallback访问webbrowser控件时C#"InvalidCastException"

hen*_*enk 3 c# browser

基本上我遇到与此用户相同的问题: 如何使用鼠标保持和释放来检查TrackBar滑动 我使用提供的第一个解决方案修复了此问题.但是,当调用计时器时,我想在Web浏览器控件上调用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;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我在做错了什么?或者是否有其他方法可以获得相同的结果?

在关于InvokeRequired的评论之后,这听起来就像我需要的那样..但是我无法让它工作..这是我从C#System.InvalidCastException的示例代码中得到的.

public delegate WebBrowser getBrowserHandler();
public WebBrowser getBrowser()
{
    if (InvokeRequired)
    {
        return Invoke(new getBrowserHandler(getBrowser)) as WebBrowser;
    }
    else
    {
        return webBrowser1;
    }
}

private void TimerElapsed(object state)
{
    WebBrowser brw = getBrowser();
    brw.Document.InvokeScript("jmpend");
    MessageBox.Show(brw.DocumentText);
    timerRunning = false;
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Kev*_*ice 6

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

请参见Control.InvokeRequired属性

应该解决您的问题的示例代码发布在这个问题上:C#System.InvalidCastException