为什么thread.join会冻结vb.net中的UI

为什么thread.join会冻结vb.net中的UI,.net,vb.net,multithreading,.net,Vb.net,Multithreading,我正在尝试多线程。创建线程后,当我尝试加入创建的线程时,我的UI似乎冻结了。如果我不加入我的线程,那么一切似乎都工作 下面是我的代码 Public Class FrmGraphWithThreads Dim t As Thread Dim tlist As List(Of Thread) Private Sub FrmGraphWithThreads_Load(sender As Object, e As EventArgs) Handles MyBase.Load

我正在尝试多线程。创建线程后,当我尝试加入创建的线程时,我的UI似乎冻结了。如果我不加入我的线程,那么一切似乎都工作

下面是我的代码

Public Class FrmGraphWithThreads

    Dim t As Thread
    Dim tlist As List(Of Thread)

    Private Sub FrmGraphWithThreads_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        UpdateTextDelegate = New UpdateTextSub(AddressOf UpdateText)
        tlist = New List(Of Thread)
    End Sub


#Region " Delegate and Delegate SUB to update Text Box "

    Private Delegate Sub UpdateTextSub(ByRef txtbx As TextBox, ByVal val As String)
    Private UpdateTextDelegate As UpdateTextSub
    Private Sub UpdateText(ByRef txtbx As TextBox, ByVal val As String)
        txtbx.Text = val
    End Sub

#End Region

    Private Sub CalculateTable(ByVal itm As Object)
        Dim _int = CInt(itm)
        Dim i As Integer

        If _int > 0 Then
            Select Case _int
                Case 1
                    For i = 1 To 10
                        Dim _val = _int * i
                        txtBx1.Invoke(UpdateTextDelegate, New Object() {txtBx1, _val.ToString})
                        Thread.Sleep(1000)
                    Next
                Case 2
                    For i = 1 To 10
                        Dim _val = _int * i
                        txtBx2.Invoke(UpdateTextDelegate, New Object() {txtBx2, _val.ToString})
                        Thread.Sleep(1000)
                    Next
            End Select
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim i As Integer

        For i = 1 To 2
            t = New Thread(AddressOf CalculateTable)
            t.Name = i.ToString
            t.Start(i)
            tlist.Add(t)
            Thread.Sleep(10)
        Next

        For Each itm As Thread In tlist
            itm.Join()'This causes freezing. Without join everything is working.
        Next
    End Sub
End Class
任何想法都会有很大帮助。

您正在调用线程。从UI线程加入。这意味着UI线程将被阻塞,直到所有其他线程完成。一般来说,这是一个坏主意,因为这意味着当所有其他线程都工作时,您的UI被阻塞

在这种情况下,这比一个坏主意更糟糕-它将死锁,因为您正在调用Control.Invoke,从其他线程调用,例如:

txtBx2.Invoke(UpdateTextDelegate, New Object() {txtBx2, _val.ToString})
调用会阻止调用线程,直到UI执行了给定的委托。因此,后台线程将被阻止,直到UI线程完成工作,UI线程将被阻止,直到后台线程完成工作。僵局


几乎可以肯定,您应该考虑使用异步/等待和任务,而不是手动线程。这会让你的生活更轻松。

好主意。谢谢你的建议。我所做的是我启动了一个新线程来启动另一个线程。@NimitVachhani:很难确切地知道您的代码是什么样子,但这听起来仍然不是一个好主意-如果您正在使用thread.Join,请从UI线程,这仍然会是个问题。@NimitVachhani:我不确定这是个好主意-这只会让这个问题的未来读者感到困惑。