2016-08-02 56 views
2

Ich lerne Multithreading in vb.net zu tun. Hier sind die Codes, aber es funktioniert nicht.vb.net Multithreading funktioniert nicht

Der Zweck dieses Programms ist es, gleichzeitig label1 und label2 von 0 bis 100000 zu zählen.

In den folgenden Codes wird das Label2 jedoch nur gezählt, wenn Label1 beendet ist. Kann mir jemand beibringen, wie man es richtig macht?

Public Class Form1 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim Thread1 As System.Threading.Thread 

    Thread1 = New System.Threading.Thread(AddressOf Me.Count1) 
    Thread1.Start() 

End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 

    Dim Thread2 As System.Threading.Thread 

    Thread2 = New System.Threading.Thread(AddressOf Me.Count2) 
    Thread2.Start() 

End Sub 

Private Sub InvokeIfRequired(del As [Delegate]) 

    If InvokeRequired Then 
     Invoke(del) 
    Else 
     del.DynamicInvoke() 
    End If 

End Sub 

Private Sub AddText1() 

    Dim i As Integer = 0 

    Do Until i = 100000 
     i += 1 
     Label1.Text = i 
     Label1.Refresh() 
    Loop 

End Sub 

Private Sub AddText2() 

    Dim i As Integer = 0 

    Do Until i = 100000 
     i += 1 
     Label2.Text = i 
     Label2.Refresh() 
    Loop 

End Sub 

Private Sub Count1() 

    InvokeIfRequired(Sub() 
         AddText1() 
        End Sub) 

End Sub 

Private Sub Count2() 

    InvokeIfRequired(Sub() 
         AddText2() 
        End Sub) 

End Sub 

End Class 

Antwort

0

Sie testen sollten, ob ein invoke zu sehen ist erforderlich, wenn der Text des Etiketts Einstellung, nicht für die ganze Schleife (und Sie die Wiederholfrequenz nicht brauchen, wenn es in einem separaten Thread ist)

Etwas wie folgt aus:

Private Sub Count1() 
    Dim i As Integer = 0 

    Do Until i = 100000 
     i += 1  
     InvokeIfRequired(Sub() Label1.Text = i.ToString()) 
    Loop 

End Sub 
+0

Ja, es perfekt funktioniert jetzt! aber kann ich wissen, warum es nicht für die ganze schleife verwendet werden kann? –

+0

Ich denke, es ist mit dem dynamischen Aufruf zu tun. Dies wartet darauf, die Text-Eigenschaft für die Dauer der Schleife aufzurufen, anstatt jedes einzelne Element –

+0

ein anderes Problem aufgetreten ist. Wenn die beiden Zahlen aufwärts zählen, kann ich keine anderen Dinge tun, wie das Schließen der Anwendung oder das Drücken anderer Tasten (z. B. Taste 3). Warum ist das passiert und wie kann ich es lösen? –