我已经搜索了一下,我想中止一个线程并重新启动它,这应该非常简单,但没有人回答。
基本上,我有一个用户通过表单进行连接,当用户被认证时,它会引发一个事件来连接用户,在另一个线程上带来一个新表单,所以如果用户断开连接,我会结束线程并将他带到连接表单,但如果他尝试再次连接,我该如何再次启动线程
启动连接窗体
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
我已经搜索了一下,我想中止一个线程并重新启动它,这应该非常简单,但没有人回答。
你不能 - 就这么简单。一旦线程成功中止(即它确实已经完成,并且处于Aborted
状态,而不仅仅是AbortRequested
),您将无法重新启动它。
听起来你应该创建一个新线程 - 如果在这种情况下确实适合使用多个线程。(目前尚不清楚为什么要拥有多个 UI 线程。通常有一个 UI 线程,但可能有多个非 UI 线程。这条规则也有例外,但你应该有一个很好的理由......
我也会避免中止线程 - 您真正可以安全地中止(然后继续使用应用程序)的唯一线程是当前线程,即使这通常只是避免更好设计的快捷方式。否则,您不知道要中止的线程实际上在做什么。
正如 jon 所说,没有办法重新启动线程,但对于任何需要解决此问题的人来说,这就是我使用的
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf newForm))
我想要这样,但是当我从一个委托开始时,我不知道为什么 处理与服务器停止的所有连接的 coms 类,我不,t 知道为什么这样,使用新线程它不会停滞
对我来说,这一切看起来都很混乱...没有适合您的干净修复程序。 正如乔恩所说,整个事情可能需要重新设计。
这不是通常的做法,但它可能会对您的情况有所帮助。
第一个按钮在另一个线程中启动窗体,而第二个按钮关闭该窗体,导致线程关闭。
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
以这种方式开始的表单之间的通信还有其他问题......小心!