2012-03-06 3 views
1

В проекте, который я недавно принял, есть вызов функции, которая выполняет некоторые вычисления; это вызывается в строке несколько раз (обычно от 1 до 10 раз).Рекомендации по обработке фона в vb.net

While dr.read ‘depending on a db call, loop 1 or more times 
Dim calc As New CalcClass 
Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff)) 
newDoStuff.Start(calc) 
End while 

Private Sub DoStuff(ByVal calc As Object) 
‘do something that takes between 5-10 seconds 
End sub 

Для того, чтобы ускорить этот процесс, я пытаюсь добавить асинхронную обработку (см выше примере), это работает в моем коде, все задачи выполняются одновременно, но то, что я не понимаю, как дождаться завершения всех этих потоков (нет заданного количества потоков, оно может быть от 1 до 10 в зависимости от некоторых других данных), прежде чем заканчивать конечную задачу, которая должна запускаться после завершения всех задач.

Может кто-нибудь предложить способ сделать это - я ищу простой способ в основном говорят «Хорошо, все задачи закончены в данный момент, вызвать другую задачу»

Cliffs

  • несколько задач необходимо запустить одновременно (между 1 и 10)
  • Каждая задача занимает несколько секунд
  • код в настоящее время работает - это делает их все в то же время
  • После все задачи (между 1-10) закончены, выпалить некоторый другой код (только тогда, когда все задачи закончены) - застрял на лучший способ сделать следующее
+2

Если вы можете, я бы переработать это использовать библиотеку задач бейфут. Однако метод ожидания других потоков называется 'Join '. Читайте об этом здесь: http://msdn.microsoft.com/en-us/library/95hbf2ta.aspx – asawyer

+0

Я не знаю, как подождать нить до конца без использования обратных вызовов. Я предлагаю не запускать поток для каждой задачи, возможно, объединить их в несколько задач и сообщить о статусе в каждой группе. –

+0

@asawyer - Пока ваш совет звучит. TPL не готов к прайм-тайм. Он будет содержаться в .NET Framework 4.5 из моего понимания. Ему не нужно использовать TPL для использования метода Thread.Join. Вы должны быть осторожны с Thread.Join, вы можете легко заставить себя Тупик. –

ответ

1

Поместите все свои нити в списке

Dim threads As new List(Of System.Threading.Thread) 

While dr.read ‘depending on a db call, loop 1 or more times 
    Dim calc As New CalcClass 
    Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff)) 
    threads.Add(newDoStuff) 
    newDoStuff.Start(calc) 
End while 

наконец присоединиться все темы

For Each thread In threads Do 
    thread.Join() 
Next 
1

Самый простой способ это поставить все ваши новые потоки в список, затем перебирайте этот список и вызывайте на каждом из них. Присоединиться метод блокирует текущий поток до нити вы Соединение завершается по:

Извинения, если есть какие-либо синтаксические ошибки в следующей code- я не имею VB под рукой, и моя память о синтаксисе довольно ржавый:

С учетом сказанного я настоятельно рекомендую вам изучить классы в System.Threading.Tasks namespace, поскольку это обеспечивает гораздо лучшую парадигму, чем запуск и управление своими потоками.

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