【问题标题】:Systems.timer.timer unwanted multithreadingSystems.timer.timer 不需要的多线程
【发布时间】:2012-03-09 00:05:22
【问题描述】:

我最近将我的代码从使用 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 说我在多线程吗?

【问题讨论】:

标签: vb.net multithreading


【解决方案1】:

System.Timers.Timer 在线程池线程上引发 Elapsed 事件。

您应该使用System.Windows.Forms.Timer,它始终使用 UI 线程。

如果你真的想要,你可以在Timers.Timer 上设置SynchronizingObject 属性,告诉它将其事件编组到 UI 线程,但没有意义。

【讨论】:

  • 我使用的是 System.Windows.Forms.Timer 但我将计时器用作秒表,并且我发现 Windows.Forms.Timer 不是为此而设计的。这里有一个很好的解释; msdn.microsoft.com/en-us/magazine/cc164015.aspx
  • 我找到了一些 synchronizingObject 的例子,但我不确定这是如何应用的。你能告诉我更多或者给我举一个很好的例子吗?
  • Timers.Timer可以调用SynchronizingObject.BeginInvoke在UI线程中运行回调
  • 好的,我设置了 timr1sec.SynchronizingObject = textbox1 并将计时器线程与表单同步。感谢您的帮助!
  • 不客气。您应该通过单击空心检查来接受此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多