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

如何从System.Timers.Timer访问表单控件(跨线程问题),timer,Timer,我使用system.timers.timer进行服务 现在我构建了一个测试表单,我也在其中使用它。在timer_appeased事件中,我做了一些工作,希望停止它需要的计时器(xxx ms),并将其写入表单控件以显示 但是当我访问listview时,我得到了一个跨线程错误 有什么想法吗?如果要从主UI线程以外的线程访问控件,则需要在要访问的控件上使用该方法。您的方法应如下所示: public void foo(int value, string message) { if

我使用system.timers.timer进行服务

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

但是当我访问listview时,我得到了一个跨线程错误


有什么想法吗?

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

您的方法应如下所示:

public void foo(int value, string message)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new Action<int, string>(foo), value, message);
        }
        else
        {
            // Stop the timer 
        }
    }
public void foo(int值,字符串消息)
{
如果(需要调用)
{
BeginInvoke(新操作(foo)、值、消息);
}
其他的
{
//停止计时
}
}

使用System.Timers.Timer时,请使用计时器的
SynchronizingObject
属性。显然,这会导致在创建指定组件(SynchronizationObject)的同一线程上调用处理已运行事件的方法。 例如,如果myButton是窗体上的控件(无论哪个GUI主线程)

这会导致已用处理程序在同一线程上运行,从而删除一些“跨线程操作”错误


请注意:我对这是否线程安全知之甚少,但在一个特定的用例中对我来说效果很好。希望它能有所帮助。

谢谢,但我以前从未使用过,你能给我一个例子/一个教程吗?底部有一个代码示例。
 System.Timers.Timer myTimer = new System.Timers.Timer();
 myTimer.SynchronizingObject = this.myButton;