如何在多线程处于活动状态时暂停循环
我有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.
我认为你想要做这样的事情。不要暂停,只需在每个循环迭代中启动一个线程。
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
循环之外。
谢谢你的帮助,但我想要的是节省时间这就是为什么我使用3线程 –
让框架为您处理:使用ThreadPool
。
首先,创建一个数组来保存每个项目的线程的状态:
Dim doneEvents(DG.Rows.Count) As ManualResetEvent
像x1
,x2
,变量,这需要从两个主线程和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
的内容。
谢谢,那么我将如何使用thread2和thread3?我使用多线程的原因是为了分配我的工作,因为如果我只使用thread1,processdata花费了30秒,所以即时尝试同时处理3个进程数据 –
processdata将卷曲到我的服务器并发回给我的工具,每个网格行响应花了30秒,所以我想分工我的工作,如果工具可以处理3个项目相同,它可以节省时间,并且可以快速执行 –
@JuliusMalundras如果要限制线程池使用三个线程,那么你可以使用['SetMaxThreads'](https://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads(v = vs.110).aspx)方法。 –
这可能是因为你使用TPL的Parallel
方法和写你这样的代码:
Parallel.For(_
0, _
DG.Rows.Count, _
New ParallelOptions() With {.MaxDegreeOfParallelism = 3}, _
Sub(i) processData(i))
我不明白你为什么processData
,processData2
和虽然。
你是说你想用三个线程来处理行,例如,行0,3,6等由processData处理,行1,4,7等由processData2处理'和第2,第5,第8行等'processData3',但一次只有三行? – Enigmativity
我想同时处理3个数据,当thread1,thread2,thread3繁忙时暂停循环,如果可用线程继续循环 –
这还不清楚。你如何为每个处理方法分配每一行? – Enigmativity