Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在嵌套任务中使用子任务_.net_Vb.net_Multithreading_Parallel Processing_Task - Fatal编程技术网

.net 如何在嵌套任务中使用子任务

.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

我正在使用parallel.For运行嵌套任务。但是对于一个基于特定条件的迭代,我必须运行一个子任务来附加那个特定的迭代任务

下面是我的示例代码

  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
实例的数量。如果有太多正在运行的
任务
实例,应用程序的性能将崩溃