Tim Tom
Tim Tom

Reputation: 2162

Task.WaitAll doesn't wait for child task?

Hello I have _noOfThreads as defined tasks to run at a time. So I keep continuing the Tasks by using % operator and at the end of the loop I have Tasks.WaitAll. This is the code snippet.

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);

However, I notice it doesn't wait for child tasks to complete. As soon as the parent tasks complete, the next line after Task.WaitAll gets executed. How do I change this code to wait for child tasks also?

Upvotes: 5

Views: 3968

Answers (2)

mellamokb
mellamokb

Reputation: 56769

You are waiting only for the original task. To wait for all the continuations to complete, you need to call WaitAll on the continuation tasks. Simple way to accomplish this would be to reassign each continuation task back to the original variable so you are waiting only on the final continuations:

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

See also this related question.

Upvotes: 3

TCM
TCM

Reputation: 16900

I think you are allocating your Tasks as:

Tasks[] tasks = new Task[ _noOfThreads];

Change your code to be:

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);

Give it a try! Good Luck :)

Upvotes: 8

Related Questions