我使用system.timers.timer作为我的服务。
现在我构建了一个测试表单,我也在其中使用它。在timer_Elapsed事件中,我做了一些工作,想要停止它需要的计时器(xxx ms)并将其写在表单控件上以显示。
但是当我访问listview时,我遇到了一个交叉线程错误。
有什么想法吗?
答案 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;错误。
请注意:我对这是否是线程安全知之甚少,但在特定用例中对我工作正常。希望它无论如何都有帮助。