如何从System.Timers.Timer访问表单控件(交叉线程问题)

时间:2009-11-27 17:27:54

标签: timer

我使用system.timers.timer作为我的服务。

现在我构建了一个测试表单,我也在其中使用它。在timer_Elapsed事件中,我做了一些工作,想要停止它需要的计时器(xxx ms)并将其写在表单控件上以显示。

但是当我访问listview时,我遇到了一个交叉线程错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果要从主UI线程以外的线程访问控件,则需要在要访问的控件上使用Invoke方法。

答案 1 :(得分:1)

您的方法应如下所示:

public void foo(int value, string message)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new Action<int, string>(foo), value, message);
        }
        else
        {
            // Stop the timer 
        }
    }

答案 2 :(得分:1)

使用System.Timers.Timer时,请使用计时器的SynchronizingObject属性。显然,这会导致处理Elapsed事件的方法在创建分配的组件(SynchronizingObject)的同一线程上调用。 例如。如果myButton是表单上的控件(无论主GUI线程如何),

 System.Timers.Timer myTimer = new System.Timers.Timer();
 myTimer.SynchronizingObject = this.myButton;

这导致Elapsed处理程序在同一个线程上运行,删除了一些交叉线程操作&#39;错误。

请注意:我对这是否是线程安全知之甚少,但在特定用例中对我工作正常。希望它无论如何都有帮助。