【问题标题】:VB.NET : Thread is running or terminated; it cannot restartVB.NET:线程正在运行或终止;它无法重新启动
【发布时间】:2014-07-22 06:48:11
【问题描述】:

我在使用多线程时遇到了这个错误。我是新手,在我的 Windows 应用程序中,此代码有效。但我将它转移到我收到的 Windows 服务“线程正在运行或终止;它无法重新启动。”在 Windows 服务中创建它时,我使用 System.Timers.Timer 而不是 System.Windows.Forms.Timer 。这个 Windows 服务将从数据库中导出一些 XML 文件,所以我需要一个计时器。因此,它会不时检查读取以下函数的数据库中是否有新产品或客户。默认情况下,我将测试时间硬编码为 1 分钟。此外,如果函数尚未完成,我已经创建了一个布尔变量。它不会覆盖。

这是我的代码:

Dim oIsproc_BP As Boolean
Dim oIsproc_ItemMaster1 As Boolean
Dim thrd As Thread

Protected Overrides Sub onstart(ByVal args() As String)

     tmr.Interval = 1000
     AddHandler tmr.Elapsed, AddressOf tmr_Elapsed
     tmr.Start()

End Sub

Private Sub tmr_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles tmr.Elapsed

     oIsproc_BP = False 
     oIsproc_ItemMaster1 = False 

     tSecItemMaster.Interval = 60000'oInterval(0)
     AddHandler tSecItemMaster.Elapsed, AddressOf tSecItemMaster_Elapsed
     tSecItemMaster.Start()

     tSecCustomer.Interval = 60000'oInterval(2)
     AddHandler tSecCustomer.Elapsed, AddressOf tSecCustomer_Elapsed
     tSecCustomer.Start()

     tmr.Stop() 
End Sub


Private Sub tSecItemMaster_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles tSecItemMaster.Elapsed
  If Not oIsproc_ItemMaster1 Then
      oIsproc_ItemMaster1 = True
      thrd = New Thread(DirectCast(Function() oItemMaster(), ThreadStart))
      thrd.Start()
  End If
  Return
End Sub



Private Sub tSecCustomer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles tSecCustomer.Elapsed
  If Not oIsproc_BP Then
      oIsproc_BP = True
      thrd = New Thread(DirectCast(Sub() oBPartners(, "C"), ThreadStart))
      thrd.Start()
  End If
  Return
End Sub

对于我的功能:

Private Function oItemMaster(Optional ByVal FirstLoad As Boolean = False, Optional oType As Integer = 1)
     ''My code here

     oIsproc_ItemMaster1 = False

End Function

Private Sub oBPartners(Optional ByVal FirstLoad As Boolean = False, Optional CardType As String = "C")
    ''My code here

     oIsproc_BP = False
End Function

【问题讨论】:

    标签: vb.net multithreading timer windows-services


    【解决方案1】:

    您有一场比赛 - 您正在使用 单个 变量 (thrd) 来保存您可能创建的 Thread 的两个实例之一。考虑两个定时器同时触发,并且为定时器提供服务的线程如下交错:

    Timer 1 (tSecItemMaster_Elapsed)    Timer 2 (tSecCustomer_Elapsed)
    
    If Not oIsproc_ItemMaster1 Then
        oIsproc_ItemMaster1 = True
                                        If Not oIsproc_BP Then
                                            oIsproc_BP = True
                                            thrd = New Thread(...)
        thrd = New Thread(...)
        thrd.Start()
    End If
    Return
                                            thrd.Start()
                                        End If
                                        Return
    

    这就是您收到错误消息的原因 - 两个计时器都试图启动在 tSecItemMaster_Elapsed 内部创建的 single Thread 对象和在 tSecCustomer_Elapsed 内部创建的 Thread永远不会开始。其他交错也会引入类似的问题。

    一个快速的解决方法是创建一个单独的字段来存储每个线程。我想你可能还有几个比赛条件,但他们现在还没有跳出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多