VB.NET按子数据对包装进行排序

VB.NET按子数据对包装进行排序,vb.net,sorting,wrappanel,Vb.net,Sorting,Wrappanel,我有一个项目,在这个项目中,我使用许多线程生成数据并对其编号(1-500),然后将其放置在标签中,然后将其放置在网格中,然后将其放置在包装内 这个问题。 线程中的一些数据在其他线程之前完成。所以我的包裹面板得到的数字如下 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(Ad

我有一个项目,在这个项目中,我使用许多线程生成数据并对其编号(1-500),然后将其放置在标签中,然后将其放置在网格中,然后将其放置在包装内

这个问题。 线程中的一些数据在其他线程之前完成。所以我的包裹面板得到的数字如下 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
Private Sub-StartSearch\u MouseLeftButtonUp
Dim t作为新线程(SearchBegin的地址)
t、 开始(数据)
端接头
子搜索开始(数据)
最大尺寸=10
Dim计数=1
当计数<最大值时
尺寸t为新螺纹(检查地址)
t、 开始(数据)
计数+=1
结束时
端接头
次级检查(数据)
“这里发生了一些事情
变暗显示为新动作(对象)(进度地址)
WrapPanel1.Dispatcher.BeginInvoke(显示,数据)
端接头
次级进度(数据)
Dim g作为新网格
“漂亮极了
Dim l作为新标签
“漂亮的标签
l、 Content=Data.tostring
g、 儿童。添加(l)
Wrappane1.Children.Add(g)
端接头
使用屏障

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

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
使用屏障

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

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

我注意到这个线程。Barrier适用于框架4.5,不适用于3.5。我还试图尽快显示数据。但这个答案确实有效,我会认为它是正确的。非常感谢您的帮助4.0也支持。顺便说一句,由于您希望对它们进行排序,并且在所有任务完成之前无法确定结果,因此我认为,除了等待所有任务之外,没有其他方法。我注意到了这个线程。屏障适用于Framework 4.5,不适用于Framework 3.5。我还试图尽快显示数据。但这个答案确实有效,我会认为它是正确的。非常感谢您的帮助4.0也支持。顺便说一句,既然你想对它们进行排序,而且在所有任务完成之前无法确定结果,我认为没有其他办法,只能等待所有人。