2013-01-03 56 views
1

我有一个项目,我通过使用多个线程生成数据并将其编号(1 - 500),并将其放置在标签内,然后放入一个网格内,然后放入网格内WrapPanel。VB.NET按儿童数据排序WrapPanel

问题。 线程中的一些数据在其他线程之前完成。所以我的包装面板得到的数字如 3 1 5 6 10 2 4 7 8 9.我想要在所有线程完成后对经纱面板进行排序,使其看起来像1 2 3 4 5 6 7 8 9 10

Private Sub StartSearch_MouseLeftButtonUp 
    Dim t As New Thread(AddressOf SearchBegin) 
    t.Start(Data) 
End Sub 

Sub SearchBegin(Data) 
    Dim Max = 10 
    Dim Count = 1 
    While Count < Max 
     Dim t As New Thread(AddressOf Check) 
     t.Start(Data) 
     count += 1 
    End While 
End Sub 

Sub Check(Data) 
    'things happen here 
    Dim display As New Action(Of Object)(AddressOf Progress) 
    WrapPanel1.Dispatcher.BeginInvoke(display, Data) 
End Sub 

Sub Progress(Data) 
    Dim g As New Grid 
    'Pretty Up Grid 
    Dim l As New Label 
    'Pretty Up Label 
    l.Content = Data.tostring 
    g.Children.Add(l) 
    WrapPanel1.Children.Add(g) 
End Sub 

回答

1

使用障碍。

要等待所有线程完成,定义一个全局障碍:

Dim barr As New Threading.Barrier(1) 

开始线程之前添加参与者:

Sub startathread() 
    barr.AddParticipant() 
    Dim t As New Threading.Thread(AddressOf blabla) 
    t.Start() 
End Sub 

当任务完成,暗示它是完成:

Sub blabla() 
    'do stuff 
    barr.SignalAndWait() 
End Sub 

现在函数启动所有线程和等待所有完成:

Sub x() 
    For i = 0 To 9 
     startathread() 
    Next 
    barr.SignalAndWait() 
    'from this line on, all the threads are completed their jobs. 
End Sub 

对于排序,你的线程必须在每个数据添加到列表:

Dim datalist As New List(Of String) 

Sub Progress(Data) 
    datalist.Add(Data.ToString) 
End Sub 

当加入所有的数据都做了功能分类并将它们放在必须被称为:

Sub SortAndPlace() 
    datalist.Sort() 

    For Each sdata In datalist 
     Dim g As New Grid 
     'Pretty Up Grid 
     Dim l As New Label 
     'Pretty Up Label 
     l.Content = sdata 
     g.Children.Add(l) 
     WrapPanel1.Children.Add(g) 
    Next 
End Sub 
+0

我注意到这个Threading.Barrier是为框架4.5,并不适用于3.5。我也试图尽快显示数据。但是,这个答案确实有效,所以不要把它标为正确。非常感谢你的帮助 – ArcSet

+0

4.0也支持。顺便说一句,既然你希望他们被排序,并且在所有任务完成之前都不能确定结果,我想,除了等待所有任务之外别无他途。 – theGD