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,如果你有几十条以上的记录,那么它会非常猛烈地撞击机器。好的。谢谢你的帮助。“我会调查的。”汉帕桑说,“他在使用参数过载。”。常见的错误。