I have the Loop which generates tasks.
Code:
Task task = null;
foreach (Entity a in AAAA)
{
// create the task
task = new Task(() => {
myMeth
var allTasks = new List<Task>();
foreach (Entity a in AAAA)
{
// create the task
task = new Task(() => {
myMethod(a);
}, Token, TaskCreationOptions.None);
// Add the tasks to a list
allTasks.Add(task);
task.Start();
}
// Wait until all tasks are completed.
Task.WaitAll(allTasks.ToArray());
I f you replace this with a
Parallel.ForEach(..., () => myMethod(a), ...)
Then you get an automatic Wait on all tasks at the end of the ForEach.
And maybe run the ForEach from a separate Task.
You'll need to keep references to all the tasks created in the loop. Then you can use the Task.WaitAll
method (see MSDN reference). You can either create an array and assign tasks to elements of the array (in C# 2.0) or you can use LINQ:
var tasks =
AAAA.Select((Entity a) =>
Task.Factory.StartNew(() => { myMethod(a); },
Token, TaskCreationOptions.None)).ToArray();
Task.WaitAll(tasks)
If you don't need to use tasks (explicitly) then Henk's suggestion to use Parallel.ForEach
is probably a better option.