Итак, я обрабатываю записи. Я использую задачу для обработки каждой записи. Моя проблема заключается в том, что моя программа завершается до завершения всех задач. Любые мысли о том, что я здесь делаю неправильно?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
UPDATE
Я решить мою проблему, используя список задач, как это было предложено @HansPassant и @usr
Причина не используется Foreach, что больше записей может быть добавленным во время обработки .. поэтому do while loop ...
Благодарим за помощь.
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
foreach намного лучше, чем делать. Я предполагаю, что это ничего не поймает. как выглядит процесс снова? – Claudius
Я согласен с улавливанием (существующий код - мой первый раз глядя на него), и я буду его обновлять. – Fiona
Довольно неясно, как вы получили это для компиляции. Вы должны передать * массив * задач для WaitAll(). Начните решать это, создав Список (Задачи). И будьте осторожны с LongRunning, что сильно затрудняет работу машины, если у вас более двух десятков записей. –