.net 如何在嵌套任务中使用子任务
我正在使用parallel.For运行嵌套任务。但是对于一个基于特定条件的迭代,我必须运行一个子任务来附加那个特定的迭代任务 下面是我的示例代码.net 如何在嵌套任务中使用子任务,.net,vb.net,multithreading,parallel-processing,task,.net,Vb.net,Multithreading,Parallel Processing,Task,我正在使用parallel.For运行嵌套任务。但是对于一个基于特定条件的迭代,我必须运行一个子任务来附加那个特定的迭代任务 下面是我的示例代码 Dim tsk As Task = Task.Run(Function() Parallel.For(0, dgvDataTables.Rows.Count, New ParallelOptions() With {.MaxDegreeOfParallelism = 1}, Sub(index) // performs certio
Dim tsk As Task = Task.Run(Function() Parallel.For(0, dgvDataTables.Rows.Count, New ParallelOptions() With {.MaxDegreeOfParallelism = 1},
Sub(index)
// performs certion action
if expression valid then
Dim childTask As Task = Task.Factory.StartNew(Sub()
// performs action
End Sub, CancellationToken.None, TaskCreationOptions.AttachedToParent)
end if
End Sub)
当我运行代码时,一旦所有迭代都完成,子任务就会被执行
如何将子任务附加到嵌套中的父任务
感谢您的帮助
TIA这种情况下的解决方案是使用不同的
并行重载。有一个允许您传递局部变量。这就是你需要的
因此,您基本上希望在外部任务中执行以下操作:
Dim childTasks As New List(Of Task)
Parallel.For(0, dgvDataTables.Rows.Count,
New ParallelOptions() With {.MaxDegreeOfParallelism = 1},
Function() New List(Of Task),
Function(index, state, taskList)
// performs certion action
If expression valid Then
Dim childTask = Task.Run(Sub()
// performs action
End Sub)
taskList.Add(childTask)
End If
Return taskList
End Function,
Sub(taskList)
SyncLock childTasks
childTasks.AddRange(taskList)
End SyncLock
End Sub)
Task.WaitAll(childTasks.ToArray())
因此,基本思想是将所有任务收集到一个列表中,并在Parallel.for
完成后等待所有收集到的任务
我故意选择在这里使用Task.WaitAll
,因为使用wait
和Task.whalll
可能会与并行.For
一起导致问题。我倾向于避免混合使用并行
函数和异步/等待
尽管如此,我必须警告您,此代码可能会产生巨大的开销,具体取决于您正在创建的Task
实例的数量。如果有太多正在运行的任务
实例,应用程序的性能将崩溃