如何重启一个线程,没有暂停或睡眠

时间:2013-11-10 21:20:21

标签: .net vb.net multithreading events

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

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

开始连接表格

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

3 个答案:

答案 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

表单之间的通信存在其他问题......请小心!