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

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

问题描述:

我有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

你是说你想用三个线程来处理行,例如,行0,3,6等由processData处理,行1,4,7等由processData2处理'和第2,第5,第8行等'processData3',但一次只有三行? – Enigmativity

+0

我想同时处理3个数据,当thread1,thread2,thread3繁忙时暂停循环,如果可用线程继续循环 –

+0

这还不清楚。你如何为每个处理方法分配每一行? – Enigmativity

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

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循环之外。

+0

谢谢你的帮助,但我想要的是节省时间这就是为什么我使用3线程 –

让框架为您处理:使用ThreadPool

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

Dim doneEvents(DG.Rows.Count) As ManualResetEvent 

x1x2,变量,这需要从两个主线程和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的内容。

+0

谢谢,那么我将如何使用thread2和thread3?我使用多线程的原因是为了分配我的工作,因为如果我只使用thread1,processdata花费了30秒,所以即时尝试同时处理3个进程数据 –

+0

processdata将卷曲到我的服务器并发回给我的工具,每个网格行响应花了30秒,所以我想分工我的工作,如果工具可以处理3个项目相同,它可以节省时间,并且可以快速执行 –

+0

@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)) 

我不明白你为什么processDataprocessData2和​​虽然。