如何修复C#中的交叉线程异常?

如何修复C#中的交叉线程异常?,c#,winforms,timer,C#,Winforms,Timer,我正在尝试在UI控件上使用System.Timers.Timer 错误: System.Timers.Timer“跨线程操作无效:从创建控件的线程以外的线程访问控件“txtOutput” 我的代码如下: System.Timers.Timer timeRandomEvent = new System.Timers.Timer(10 * 1000); // timer for random events timeRandomEvent.Elapsed += new ElapsedEvent

我正在尝试在UI控件上使用System.Timers.Timer

错误: System.Timers.Timer“跨线程操作无效:从创建控件的线程以外的线程访问控件“txtOutput”

我的代码如下:

System.Timers.Timer timeRandomEvent = new System.Timers.Timer(10 * 1000); 

// timer for random events  
timeRandomEvent.Elapsed += new ElapsedEventHandler(timeRandomEvent_Elapsed);
timeRandomEvent.Start();

void timeRandomEvent_Elapsed(object sender, ElapsedEventArgs e) 
{
    wl("Adding some text to a text box.");   // Exception occurs here
}
有没有一种方法可以让它实现,或者另一种希望很容易实现的替代方案

您需要将计时器的属性设置为表单对象

timer.SynchronizingObject = this; // Synchronize the timer with this form UI
官方文件的相关摘录:

当运行事件由可视Windows窗体组件处理时, 例如按钮,通过系统线程访问组件 池可能会导致异常,或者可能无法工作。避免这种情况 通过将SynchronizingObject设置为Windows窗体组件, 这将导致调用处理已运行事件的方法 在其上创建组件的同一线程


好极了谢谢大家!@菲尔:不客气,我很高兴这有帮助。我想你应该用
[winforms]
来标记你的问题,顺便说一句(也许还有
[timer]
),而不是
[multi-threading]
。你能不能用
系统.窗口.窗体.timer
来代替呢?@hatchet虽然这似乎是winforms的自然选择,
System.Windows.Forms.Timer
实际上不如
System.Timers.Timer
()准确。因此,如果OP想要一个具有更精确计时器的WinForms应用程序,
System.Timers.timer
是一个不错的选择。@JWLim-我考虑过,但他/她的代码中的计时器设置为每10秒启动一次,我认为55毫秒的分辨率问题可能无关紧要。@hatchet我同意,但这仍然值得一提,因为我们不确定OP是否会使用实际的代码:)此外,我认为了解您的选项总是一件好事,以免您试图将它们用于非设计用途。