在多线程应用程序

时间:2015-05-15 13:07:53

标签: vb.net multithreading

有人可以显示/告诉我我在哪里导致错误吗?我在我的应用程序中运行第二个线程,其中所有操作都是从运动控制器中的寄存器读取值,然后每隔100毫秒不断地将这些值更新到我的UI上的相应字段。当我断开控制器(即......以太网电缆断开连接,丢失通信)时,我想彻底销毁/终止线程(thread1)。当我重新连接以太网电缆时,我单击我的UI上的一个按钮以重新建立到控制器的通信,并执行Runthread()Sub。那是我想重新创建线程并启动它的时候。但是,在调试这部分代码时,似乎线程(thread1)永远不会被破坏,即使我已经验证代码确实到达那一行(案例1)并执行它。在重新建立通信之后,代码直接进入案例3并启动thread1,我希望它跳转到案例2并重新创建线程。

Public Class frmMain
    Private RMC As RMCLink
    Public thread1 As System.Threading.Thread = New System.Threading.Thread(AddressOf ReadRegisters)
    Private Sub RunThread()
        Dim conditions As Integer
        If RMC.IsConnected(PingType.Ping) = False And thread1 IsNot Nothing Then
            conditions = 1
        ElseIf RMC.IsConnected(PingType.Ping) = True And thread1 Is Nothing Then
            conditions = 2
        ElseIf RMC.IsConnected(PingType.Ping) = True And thread1 IsNot Nothing Then
            conditions = 3
        End If

        Select Case conditions
            Case 1
                Thread.Sleep(100)
                thread1.Abort()
            Case 2
                Dim thread1 As System.Threading.Thread = New System.Threading.Thread(AddressOf ReadRegisters)
                thread1.Start()
            Case 3
                thread1.Start()
        End Select
    End Sub

1 个答案:

答案 0 :(得分:1)

文档(https://msdn.microsoft.com/en-us/library/system.threading.thread.abort(v=vs.110).aspx)声明它通常会终止该线程,但正如您所发现的那样并非总是如此。

实现此目的的一种方法(我确定还有其他方法)是创建一个公共PleaseDie属性,您的线程的子例程会定期检查,如果该属性设置为True,则退出线程中的子程序。在线程启动之前,您当然必须将PleaseDie重置为False。