我有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个。
答案 0 :(得分:3)
让框架为您处理:使用ThreadPool
。
首先,创建一个数组来保存每个项目的线程状态:
Dim doneEvents(DG.Rows.Count) As ManualResetEvent
与x1
,x2
,x3
变量一样,您需要从主线程和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))
我不明白为什么你有processData
,processData2
和processData3
。