使用计时器和2个按钮进行跨线程操作无效

rus*_*sky -3 c# exception invoke

我有这个问题...

有什么好的解决方案?

 private void button1_Click(object sender, EventArgs e)
    {
        aTimer.Enabled = true;
        button1.Enabled = false;

    }

    private void button2_Click(object sender, EventArgs e)
    {
        aTimer.Enabled = false;
    }

    private void timer_is_working(object source, ElapsedEventArgs e)
    {
        aTimer.Enabled = false;
        button1.Enabled = true;
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!此致Daniel Ruescher

Gyö*_*zeg 5

因此,您没有说清楚,但是根据ElapsedEventArgs类型,似乎timer_is_working是实例的Elapsed事件System.Timers.Timer

请注意,.NET Framework类库包括四个名为Timer的类,每个类提供不同的功能:

  • System.Timers.Timer:定期触发一个事件。该类旨在在多线程环境中用作基于服务器或服务的组件。
  • System.Threading.Timer:定期在线程池线程上执行单个回调方法。回调方法是在实例化计时器且无法更改时定义的。与System.Timers.Timer类类似,该类旨在用作多线程环境中的基于服务器或服务的组件。
  • System.Windows.Forms.Timer:一个Windows Forms组件,该组件定期触发事件。该组件设计用于单线程环境。
  • System.Web.UI.Timer:一个ASP.NET组件,该组件定期执行异步或同步网页回发。

如果这是Windows.Forms应用程序,请System.Windows.Forms.Timer改用(在“工具箱/组件”中找到它)。它的Tick事件在UI线程中引发,因此可以从那里访问您的控件。

如果您出于特殊原因需要使用System.Timers.Timer(例如,精度),则必须将访问权限包装到Invoke呼叫中:

Invoke(new Action(() => { button1.Enabled = true; }));
Run Code Online (Sandbox Code Playgroud)