【问题标题】:Cross-thread operation not valid using timer and 2 buttons使用定时器和 2 个按钮的跨线程操作无效
【发布时间】:2015-09-02 12:26:02
【问题描述】:

我遇到了这个问题...

对此有什么好的解决方案?

 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;
    }

谢谢! 亲切的问候 丹尼尔·鲁舍尔

【问题讨论】:

  • timer_is_working内部,只能在用户界面线程中启用button1。很可能有一个用于 UI 的专用线程(尽管不确定您正在处理哪种应用程序),因此您需要执行以下操作:timer_is_working 内部的Dispatcher.Invoke(() => { button1.Enabled = true; });。顺便说一句,您的问题写得不好,人们会否决它;如果我是你,为了安全起见,我会修改问题并改变措辞,以帮助人们知道你的问题到底出在哪里。您可能需要考虑添加更多代码以更具描述性。
  • 请添加更多文本、信息和研究。告诉我们你做了什么。我们在这里帮助您学习,而不是免费的软件支持。

标签: c# exception invoke


【解决方案1】:

所以你没有说清楚,但基于 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 窗体组件。该组件设计用于单线程环境。
  • System.Web.UI.Timer:一个定期执行异步或同步网页回发的 ASP.NET 组件。

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

如果您有特殊原因使用System.Timers.Timer(例如精度),则必须将您的访问权限封装到Invoke 调用中:

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

【讨论】:

  • 我在 WPF 应用程序的示例代码中使用 System.Timers.Timer,但试图在 WinForms 应用程序上使用它。谢谢。
【解决方案2】:

您可以使用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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多