有人可以显示/告诉我我在哪里导致错误吗?我在我的应用程序中运行第二个线程,其中所有操作都是从运动控制器中的寄存器读取值,然后每隔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
答案 0 :(得分:1)
文档(https://msdn.microsoft.com/en-us/library/system.threading.thread.abort(v=vs.110).aspx)声明它通常会终止该线程,但正如您所发现的那样并非总是如此。
实现此目的的一种方法(我确定还有其他方法)是创建一个公共PleaseDie
属性,您的线程的子例程会定期检查,如果该属性设置为True,则退出线程中的子程序。在线程启动之前,您当然必须将PleaseDie
重置为False。