如何重新启动线程,没有暂停也没有睡眠



我已经搜索了一下,我想中止一个线程并重新启动它,这应该非常简单,但没有人回答。

基本上,我有一个用户通过表单进行连接,

当用户被认证时,它会引发一个事件来连接用户,在另一个线程上带来一个新表单,所以如果用户断开连接,我会结束线程并将他带到连接表单,但如果他尝试再次连接,我该如何再次启动线程

启动连接窗体

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

以这种方式开始的表单之间的通信还有其他问题......小心!

最新更新