2016-06-10 79 views
0

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

回答

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

+0

謝謝你的幫助,但我想要的是節省時間這就是爲什麼我使用3線程 –

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)方法。 –

0

這可能是因爲你使用TPL的Parallel方法和寫你這樣的代碼:

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

我不明白你爲什麼processDataprocessData2和​​雖然。

相關問題