1

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

问题。线程中的一些数据先于其他数据完成。所以我的 Wrap 面板得到像 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
4

1 回答 1

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
于 2013-01-03T16:43:09.687 回答