C#WinForms:仅来自Timer.ElapsedEventHandler

时间:2018-04-25 13:14:06

标签: c# winforms event-handling

我创建了一个带有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");
}

如果有人能帮助我,我将非常感激。

1 个答案:

答案 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不喜欢从其他线程访问。