2016-07-13 5 views
0

Так что у меня такой поток:Подождите, пока все рабочие не сделали

  1. Создание задания рабочих х
  2. Есть некоторые вещи
  3. Подождите, пока все задания рабочих закончил
  4. Продолжить

Я написал этот код:

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 

Пока этот код работает до сих пор, я чувствую, что это не очень хорошая практика. Не могли бы вы дать мне несколько советов, как лучше решить эту проблему? Благодаря!

+1

'Task.WaitAll (workerTasks. ToArray()) '? Или 'Task.WhenAll (...)'? –

+0

https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx –

ответ

2

Вы можете использовать Task.WaitAll() вместо:

Task.WaitAll(workerTasks.ToArray()); 

Или для асинхронных методов:

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

Или вернуть задачу вызывающему:

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