vb.net不等待所有任务完成

vb.net不等待所有任务完成,vb.net,task,Vb.net,Task,所以我在处理记录。我正在使用一个任务来处理每条记录。 我的问题是我的程序在所有任务完成之前就已经完成了。 有人知道我做错了什么吗 Dim task As Task Try 'Keep looping until no more requests to run have been made Do Dim controller As New Controller(

所以我在处理记录。我正在使用一个任务来处理每条记录。 我的问题是我的程序在所有任务完成之前就已经完成了。 有人知道我做错了什么吗

        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的原因是,在处理时可以添加更多记录。。因此,执行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
Task.WaitAll(Task)
正在等待一个任务。其他人在哪里?你把它们都存起来了吗?从这个代码中看不明显

理想情况下,您可以转换此代码,以便它可以使用
Parallel.ForEach
。您需要将工作项设置为
IEnumerable
格式,以使其正常工作。例如,将它们添加到
列表
,并将列表馈送到
Parallel.ForEach

任务。WaitAll(任务)
正在等待一个任务。其他人在哪里?你把它们都存起来了吗?从这个代码中看不明显


理想情况下,您可以转换此代码,以便它可以使用
Parallel.ForEach
。您需要将工作项设置为
IEnumerable
格式,以使其正常工作。例如,将它们添加到
列表
,并将列表馈送到
Parallel.ForEach

foreach是比do更好的解决方案。我猜它什么也抓不到。这个过程又是什么样子的?我同意你是捕获的(现有代码——我第一次看到它),我会更新它。很不清楚你是如何编译的。您应该向WaitAll()传递一个任务数组。通过创建(任务)列表开始解决此问题。要小心LongRunning,如果你有几十条以上的记录,那么它会非常猛烈地撞击机器。好的。谢谢你的帮助。“我会调查的。”汉帕桑说,“他在使用参数过载。”。常见的错误。foreach是比do更好的解决方案。我猜它什么也抓不到。这个过程又是什么样子的?我同意你是捕获的(现有代码——我第一次看到它),我会更新它。很不清楚你是如何编译的。您应该向WaitAll()传递一个任务数组。通过创建(任务)列表开始解决此问题。要小心LongRunning,如果你有几十条以上的记录,那么它会非常猛烈地撞击机器。好的。谢谢你的帮助。“我会调查的。”汉帕桑说,“他在使用参数过载。”。常见的错误。