2017-06-01 55 views
0

我正在使用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

回答

0

在这种情况下的解决方案是使用的Parallel.For一个不同的过载。有一个允许你传递一个局部变量。这是你需要的。

Parallel.For(Of TLocal)

所以你基本上要你的外在任务里面做的是:

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这里使用,因为使用AwaitTask.WhenAllParallel.For导致问题在一起。我倾向于避免混合Parallel函数和Async/Await

说了这么多,我必须警告你,这段代码可能会产生大量开销,具体取决于你创建多少个Task实例。如果有太多正在运行的实例,则应用程序的性能会下降。