2016-08-02 97 views
2

我正在学习如何在vb.net中执行多线程。这里是代码,但它不起作用。vb.net多线程不工作

该程序的用途是同时计数从0到100000的label1和label2。

但是,在下面的代码中,当label1完成时,label2将只计数。任何人都可以教我如何正确地做到这一点?

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 

回答

0

您应该测试,看看是否需要调用设置标签的文本时,不是针对整个循环(和你不需要刷新,如果它在一个单独的线程)

类似这样的:

Private Sub Count1() 
    Dim i As Integer = 0 

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

End Sub 
+0

是的,它现在完美了!但我能知道为什么它不能用于整个循环? –

+0

我认为这是与动态调用。这是等待在循环的持续时间内调用Text属性,而不是每个单独的项目 –

+0

发生的另一个问题。当这两个数字正在计数时,我不能做其他事情,如关闭应用程序或按其他按钮(例如,按钮3)。为什么发生这种情况,我该如何解决它? –