0

我四处寻找,我想中止一个线程并重新启动它,这应该很简单,但没有人回答。

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

开始连接表格

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
4

3 回答 3

3

我四处寻找,我想中止一个线程并重新启动它,这应该很简单,但没有人回答。

你不能——就这么简单。一旦线程被成功中止(即它确实已经完成,并且处于 状态Aborted,而不仅仅是AbortRequested),您将无法重新启动它。

听起来您应该只是创建一个新线程-如果在这种情况下确实适合使用多个线程。(不清楚为什么要拥有多个 UI 线程。通常只有一个 UI 线程,但可能有多个非 UI 线程。这条规则有例外,但你应该有一个非常好的理由......)

也会避免中止线程 - 您可以真正安全地中止(然后继续使用应用程序)的唯一线程是当前线程,即使这通常只是避免更好设计的捷径。否则你不知道你正在中止的线程到底在做什么。

于 2013-11-10T21:23:15.510 回答
0

正如乔恩所说,没有办法重新启动线程,但对于任何需要解决这个问题的人来说,这就是我所使用的

ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf newForm))
于 2013-11-10T22:08:36.297 回答
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

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

于 2013-11-10T22:22:31.157 回答