为什么thread.join会冻结vb.net中的UI
我正在尝试多线程。创建线程后,当我尝试加入创建的线程时,我的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
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:我不确定这是个好主意-这只会让这个问题的未来读者感到困惑。