vb.net Не дожидаясь завершения всех задач
Итак, я обрабатываю записи. Я использую задачу для обработки каждой записи. Моя проблема в том, что моя программа завершается до завершения всех задач. У кого-нибудь есть мысли о том, что я здесь делаю не так?
Dim task As Task
Try
'Keep looping until no more requests to run have been made
Do
Dim controller As New Controller()
Dim record As Record = controller.GetNextRecord()
If record IsNot Nothing Then
'Use Task!
task = Task.Factory.StartNew(Sub() controller.ProcessRecord(record), TaskCreationOptions.LongRunning)
CalledWhenBusy = True
End If
TryAgain:
Loop Until ProcessAgain() = False
Catch ex As System.Net.WebException
logger.ErrorException("unable to connect to remoting server", ex)
Finally
logger.Info("Processed all records.. now about to wait for all tasks to complete")
'Wait till all tasks have stopped running
Task.WaitAll(task)
logger.Info("Processed all records.. All tasks have completed")
'The dispatcher has finished for now so clean up
Me.StopUsing()
End Try
Private Function ProcessAgain() As Boolean
If CalledWhenBusy Then
'Reset the flag and exit with true
CalledWhenBusy = False
Return True
End If
Return False
End Function
ОБНОВИТЬ
Я решил свою проблему, используя список задач, предложенный @HansPassant и @usr
Причина, по которой не используется Foreach, заключается в том, что при обработке может быть добавлено больше записей... отсюда цикл do while...
Спасибо за помощь.
Dim taskList = New List(Of Task)()
Try
'Keep looping until no more requests to run have been made
Do
Dim controller As New Controller()
Dim record As Record = controller.GetNextRecord()
If record IsNot Nothing Then
'Use Task!
taskList.Add(Task.Factory.StartNew(Sub() controller.ProcessRecord(record)))
CalledWhenBusy = True
End If
TryAgain:
Loop Until ProcessAgain() = False
Catch ex As System.Net.WebException
logger.ErrorException("unable to connect to remoting server", ex)
Finally
logger.Info("Processed all records.. now about to wait for all tasks to complete")
'Wait till all tasks have stopped running
Task.WaitAll(taskList.ToArray())
logger.Info("Processed all records.. All tasks have completed")
'The dispatcher has finished for now so clean up
Me.StopUsing()
End Try
1 ответ
Task.WaitAll(task)
просто ждет одного задания. Где остальные? Вы даже хранили их? Не видно из этого кода.
В идеале вы должны преобразовать этот код, чтобы он мог использовать Parallel.ForEach
, Вы должны поместить рабочие элементы в IEnumerable
формат для того, чтобы работать. Например, добавить их в List
и кормить список Parallel.ForEach
,