我已经四处寻找,我想中止一个线程并重新启动它,这应该是非常简单但没有人回答。
基本上我有一个用户通过表单进行连接,当用户被认证时它会引发一个事件来连接用户在另一个线程上带来一个新表单,所以如果用户断开连接我结束线程并将他带到连接形式,但如果他再次尝试连接如何再次启动线程
开始连接表格
Private Sub sAuthentified(ByVal Sender As Coms, ByVal sTemp As String) Handles mComs.sAuthentified
If (Equals(Sender.AES_Decrypt(sTemp), "$%?SuccesS&*(")) Then
Dim d1 As New HideForm(AddressOf Hide)
Me.Invoke(d1)
t1.Start()
Else
ToolTip1.Show(String.Empty, UsernameField, 103, 10, 1)
ToolTip1.Show("Matricule et/ou password ne sont pas valide.", UsernameField, 103, 10, 1000)
End If
End Sub
结束已连接的表单
Private Sub Me_Disconnect(ByVal Sender As Coms) Handles mComs.Disconnect
mComs = Nothing
t1.Abort()
connectedForm.Dispose()
Dim d As New ShowForm(AddressOf Show)
Me.Invoke(d)
End Sub
由t1开始
Private Sub newForm()
connectedForm = New Connected(mComs, sUser_sPass)
connectedForm.ShowDialog()
connectedForm.Dispose()
mComs.sendMessage(Coms.enumTags.Disconnect)
End Sub
答案 0 :(得分:3)
我已经四处寻找,我想中止一个线程并重新启动它,这应该是非常简单但没有人回答。
你不能 - 就这么简单。一旦线程成功中止(即它已经完成,并且状态为Aborted
,而不仅仅是AbortRequested
),您就无法重新启动它。
听起来你应该只是创建一个新线程 - 如果确实在这种情况下完全使用多个线程是合适的。 (目前尚不清楚为什么你想拥有多个UI线程。通常只有一个UI线程,但可能有多个非UI线程。这个规则有例外,但你应该有一个很好的理由......)< / p>
我也避免中止线程 - 你可以真正安全地中止(然后继续使用应用程序)的唯一线程是当前线程,即使这通常只是避免更好设计的捷径。否则你不知道你正在中止的线程是什么。
答案 1 :(得分:0)
正如jon所说,没有办法重新启动一个线程,但对于任何需要一种方法来解决这个问题的人来说,这就是我用过的东西
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf newForm))
答案 2 :(得分:0)
我想这样,但是当我从一个删除开始时,我不知道为什么 处理与服务器停止的所有连接的coms类我不知道 知道为什么这样一个新的线程它不会停止
对我来说这一切看起来都很混乱......没有一个干净的解决方案。正如乔恩所说,整个事情可能需要重新设计。
这不是通常的事情,但它可能对你的情况有所帮助。
第一个按钮在另一个线程中启动表单,而第二个按钮关闭该表单,导致线程关闭。
Public Class Form1
Private T1 As System.Threading.Thread = Nothing
Private connectedForm As Connected = Nothing
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
If IsNothing(T1) Then
T1 = New System.Threading.Thread(AddressOf newForm)
T1.Start()
End If
End Sub
Private Sub newForm()
connectedForm = New Connected() ' New Connected(mComs, sUser_sPass)
Application.Run(connectedForm)
connectedForm = Nothing
T1 = Nothing
' mComs.sendMessage(Coms.enumTags.Disconnect)
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
If Not IsNothing(connectedForm) AndAlso Not connectedForm.IsDisposed Then
connectedForm.BeginInvoke(Sub()
connectedForm.Close()
End Sub)
End If
End Sub
End Class
表单之间的通信存在其他问题......请小心!