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

时间:2015-09-02 12:26:03

标签: 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;
    }

谢谢! 亲切的问候 Daniel Ruescher

2 个答案:

答案 0 :(得分:3)

您可以使用Invoke使用UI线程更新UI。

试试这个例子

private void timer_is_working(object source, ElapsedEventArgs e)
{
    ExecuteSecure(() => aTimer.Enabled = false);        
    ExecuteSecure(() => button1.Enabled = true);
}

private void ExecuteSecure(Action action)
{
    if (InvokeRequired)
    {
        Invoke(new MethodInvoker(() =>
        {
            action();
        }));
    }
    else
    {
        action();
    }
}

答案 1 :(得分:3)

所以你没有说清楚,但基于ElapsedEventArgs类型,似乎timer_is_workingElapsed个实例的System.Timers.Timer事件。

  

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

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

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

如果您有特殊原因要使用System.Timers.Timer(例如精确度),则必须将您的访问权限包含在Invoke来电中:

Invoke(new Action(() => { button1.Enabled = true; }));