Michael Pittino
Michael Pittino

Reputation: 1626

Wait until all workers are done

So I have this kind of flow:

  1. Create x worker tasks
  2. Do some stuff
  3. Wait until all worker tasks finished
  4. Proceed

I wrote this piece of code:

List<Task> workerTasks = new List<Task>();

foreach (Worker worker in workers)
{
    Task task = Task.Factory.StartNew(() => 
    {
        worker.Start();
        worker.Dispose();
    });

    workerTasks.Add(task);
}

// Do some work here

// Wait for unfinished workers
while (workerTasks.Where(t => !t.IsCompleted).Count() > 0) { }

// Proceed

While this code works so far I feel like it isn't good practice. Would you give me some tips how to solve this problem in a better way? Thanks!

Upvotes: 0

Views: 123

Answers (1)

Zein Makki
Zein Makki

Reputation: 30022

You can use Task.WaitAll() instead :

Task.WaitAll(workerTasks.ToArray() );

Or for async methods:

await Task.WhenAll(workerTasks.ToArray());

Or return the task to the caller:

return Task.WhenAll(workerTasks.ToArray());

Upvotes: 2

Related Questions