如何在多线程处于活动状态时暂停循环

时间:2016-06-10 22:37:23

标签: vb.net multithreading

我有3个在循环内调用的线程。

For i As Integer = 0 To DG.Rows.Count - 1
    Dim thread1 = New System.Threading.Thread(AddressOf processData)
    Dim thread2 = New System.Threading.Thread(AddressOf processData2)
    Dim thread3 = New System.Threading.Thread(AddressOf processData3)
    If Not thread1.IsAlive Then
       x1 = i
       thread1.Start()
    ElseIf Not thread2.IsAlive Then
       x2 = i
       thread2.Start()
    ElseIf Not thread3.IsAlive Then
        x3 = i
        thread3.Start()
    End If
Next

如何在所有线程都处于活动状态时暂停循环? 我想要的是,如果其中一个线程完成然后继续循环并获得(i),然后如果没有可用线程则再次暂停循环。因为有时DG.Rows项目超过3个。

3 个答案:

答案 0 :(得分:3)

让框架为您处理:使用ThreadPool

首先,创建一个数组来保存每个项目的线程状态:

Dim doneEvents(DG.Rows.Count) As ManualResetEvent

x1x2x3变量一样,您需要从主线程和processData方法访问这些变量。

然后修改您的processData方法以在开头接受Object参数并在结尾处设置ResetEvent:

Public Sub processData(ByVal data As Object)
   Dim x As Integer = CInt(data)

    '...
    'Existing code here

    doneEvents(x).Set()
End Sub

现在你可以像这样将它们排队:

For i As Integer = 0 To DG.Rows.Count - 1
    ThreadPool.QueueUserWorkItem(processData, i)
Next
WaitHandle.WaitAll(doneEvents)
Console.WriteLine("All data is processed.")

虽然我怀疑您还应该将网格中每行的数据传递给processData方法。

您还可以使用较新的Async / Await关键字,但如果不知道processData的某些内容,我将很难为此编写示例。

答案 1 :(得分:0)

我想你想做这样的事情。不要暂停,只需每次循环迭代启动一个线程。

For i As Integer = 0 To DG.Rows.Count - 1
    Dim thread1 = New System.Threading.Thread(AddressOf processData)
    thread1.Start(i)
Next

但无论如何,我认为你不想在每个循环中调用new System.Threading.Thread。这些应该移到For循环之外。

答案 2 :(得分:0)

可能是您使用TPL的Parallel方法并编写如下代码:

Parallel.For( _
    0, _
    DG.Rows.Count, _
    New ParallelOptions() With {.MaxDegreeOfParallelism = 3}, _
    Sub(i) processData(i))

我不明白为什么你有processDataprocessData2processData3