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,

Другие вопросы по тегам