我创建了一个带有Web浏览器的C#WinForms项目和单独的控件来单击webbrowser中的某些按钮,到目前为止一切正常。但是,应该定期点击其中一个按钮(我选择20秒进行调试)。我尝试使用System.Timers.Timer单击它,该事件在.Elapsed事件中触发。
webBrowser2.Document.GetElementById("link_logout").InvokeMember("click");
每当按下该按钮时(即该行在ElapsedEventHandler中),我就会在这一行得到一个System.InvalidCastException。当我尝试单击其他按钮或填充文本字段时也会发生同样的情况。
奇怪的是,当我执行Button_Click事件时,单击按钮或填充文本字段可以正常工作。
问题显然不是html元素不在那里,我在if子句中得到了相同的异常,在if行中(element!= null)。
以下是我的一些代码:
System.Timers.Timer t = new System.Timers.Timer(20 * 1000);
SomeMethodAtTheStart()
{
t.Start();
t.AutoReset = true;
t.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
webBrowser2.Document.GetElementById("link_logout").InvokeMember("click");
}
private void tsmiConnect_Click(object sender, EventArgs e)
{
webBrowser2.Document.GetElementById("link_logout").InvokeMember("click");
}
如果有人能帮助我,我将非常感激。
答案 0 :(得分:1)
来自MSDN
与System.Windows.Forms.Timer不同,System.Timers.Timer类默认情况下会调用从公共语言运行时(CLR)线程池获取的工作线程上的计时器事件处理程序。 这意味着您的Elapsed事件处理程序中的代码必须符合Win32编程的黄金规则:永远不应该从用于实例化它的线程以外的任何线程访问控件的实例。
改为使用System.Windows.Forms.Timer
。
修改:与问题this answer
中的InvalidCastException when using webbrowser and threads一样WebBrowser不喜欢从其他线程访问。