2016-06-10 3 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 данных одновременно и цикл паузы while 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 

Подобно 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.

+0

Спасибо, как я буду использовать thread2 и thread3?Причина, по которой я использую multithread, состоит в том, чтобы разделить мою работу, потому что, если я использую только thread1, processdata занимает 30 секунд, поэтому я пытаюсь одновременно работать с 3 данными процесса. –

+0

Сообщение processdata завершает работу на моем сервере и отправляет его обратно мой инструмент, потребовалось 30 секунд для каждого ответа строки сетки, поэтому я хочу разделить свою работу, если инструмент может обрабатывать 3 элемента одновременно, это экономит время и может быстро выполнить –

+0

@JuliusMalundras Если вы хотите ограничить использование threadpool в использовании три потока, то вы можете использовать метод ['SetMaxThreads'] (https://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads (v = vs.110) .aspx). –

0

Это может быть, что вы используете Parallel методы TPL и написать такой код:

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

Я не понимаю, почему у вас есть processData, processData2 и processData3 хотя.

Смежные вопросы