5

您好,我有_noOfThreads一次定义的任务要运行。所以我继续使用%运算符继续任务,在循环结束时我有Tasks.WaitAll. 这是代码片段。

for (int index = 0; index < count; index++)
{

                if (index < _noOfThreads)
                    tasks[index] = Task.Factory.StartNew(somedelegate);
                else
                    tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
                            TaskContinuationOptions.AttachedToParent);
 }
  Task.WaitAll(tasks);

但是,我注意到它不会等待子任务完成。父任务完成后,将执行下一行Task.WaitAll。如何更改此代码以等待子任务?

4

2 回答 2

8

我认为您将任务分配为:

Tasks[] tasks = new Task[ _noOfThreads];

将您的代码更改为:

Tasks[] tasks = new Task[count];

for (int index = 0; index < count; index++)
{

    if (index < _noOfThreads)
         tasks[index] = Task.Factory.StartNew(somedelegate);
    else
         tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
                            TaskContinuationOptions.AttachedToParent);
}
Task.WaitAll(tasks);

试试看!祝你好运 :)

于 2012-05-23T13:35:09.323 回答
3

您只在等待原始任务。要等待所有延续完成,您需要调用WaitAll延续任务。完成此操作的简单方法是将每个延续任务重新分配回原始变量,以便您只等待最终延续:

else
    tasks[index % _noOfThreads] =
        tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
                        TaskContinuationOptions.AttachedToParent);

另请参阅此相关问题

于 2012-05-23T13:36:47.130 回答