2017-05-10 3 views
0

私はマルチスレッドで自分の手を試しています。スレッドを作成した後、作成したスレッドに参加しようとすると、UIがフリーズしているように見えます。私のスレッドに参加しないと、すべてがうまくいくようです。なぜthread.joinがvb.netの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 

いずれのアイデアも大きな助けになります。

答えて

1

あなたはUIスレッドからThread.Joinに電話しています。つまり、UIスレッドは、他のすべてのスレッドが完了するまでブロックされます。それは悪い考えです。一般にあなたのUIはブロックされていますが、他のスレッドはすべて機能しています。この場合、それはしかし、悪いアイデアよりも悪い年代に

- あなたは、例えば他のスレッドから Control.Invokeを呼び出しているので、それは、デッドロックします:

txtBx2.Invoke(UpdateTextDelegate, New Object() {txtBx2, _val.ToString}) 

Control.Invokeブロック呼び出し元のスレッドをUIが実行されるまで指定された代議員。したがって、UIスレッドが終了するまでブロックされるバックグラウンドスレッドがあり、バックグラウンドスレッドが終了するまでUIスレッドはブロックされます。デッドロック。

このマニュアルのスレッド化ではなく、async/awaitとtasksの使用を検討する必要があります。あなたの人生はlotに簡単になります。

+0

素晴らしいアイデア。アドバイスをありがとう。私がしたことは、私は他のスレッドを開始する新しいスレッドを開始したことです。 –

+0

@NimitVachhani:あなたのコードがどのようなものかを正確に知ることは難しいですが、これはまだ素晴らしいアイデアのようには聞こえません。UIスレッドから 'Thread.Join'を使用しているのであれば、まだ問題があります。 –

+0

編集したコードを私の質問に投稿します。 –

関連する問題