我最近将我的代码从使用windows.forms.timer切换到systems.timer.timer,导致多线程错误。我正在使用计时器来触发一个事件,因此多线程应该不是问题。为了提供更多细节,我在下面实现了计时器: 在课程的顶部,我有:
Private Shared timr1sec As System.Timers.Timer
程序加载时(Private Sub Test_load):
timr1sec = New System.Timers.Timer(1000)
AddHandler timr1sec.Elapsed, AddressOf OnTimedEvent
在OnTimedEvent中,我调用了几个子程序,并使用ListView对象将一些数据写入屏幕。 VisualExpress在此代码的最后一行抛出多线程错误,该代码位于OnTimedEvent
Dim itm As New ListViewItem(str(0))
itm.SubItems.Add(str(1))
itm.SubItems.Add(str(2))
itm.SubItems.Add(str(3))
itm.SubItems.Add(str(4))
itm.SubItems.Add(str(5))
ListView1.Items.AddRange(New ListViewItem() {itm})
知道这个新计时器是什么导致VisualExpress说我是多线程?
答案 0 :(得分:3)
System.Timers.Timer
在线程池线程上引发其Elapsed
事件。
您应该使用System.Windows.Forms.Timer
,它始终使用UI线程。
如果您真的想要,可以在SynchronizingObject
上设置Timers.Timer
属性,告诉它将其事件封送到UI线程,但没有意义。