2017-06-01 56 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實例。如果有太多正在運行的實例,則應用程序的性能會下降。