2016-03-10 3 views
0

Итак, я обрабатываю записи. Я использую задачу для обработки каждой записи. Моя проблема заключается в том, что моя программа завершается до завершения всех задач. Любые мысли о том, что я здесь делаю неправильно?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 
+0

foreach намного лучше, чем делать. Я предполагаю, что это ничего не поймает. как выглядит процесс снова? – Claudius

+0

Я согласен с улавливанием (существующий код - мой первый раз глядя на него), и я буду его обновлять. – Fiona

+3

Довольно неясно, как вы получили это для компиляции. Вы должны передать * массив * задач для WaitAll(). Начните решать это, создав Список (Задачи). И будьте осторожны с LongRunning, что сильно затрудняет работу машины, если у вас более двух десятков записей. –

ответ

2

Task.WaitAll(task) просто ждет одной задачи. Где остальные? Вы даже сохранили их? Не очевидно из этого кода.

В идеале вы преобразуете этот код так, чтобы он мог использовать Parallel.ForEach. Для этого вам нужно поместить рабочие элементы в формат IEnumerable. Например, добавьте их в List и отправьте список до Parallel.ForEach.

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