2016-07-13 17 views
0

So habe ich diese Art von Flow:Warten Sie, bis alle Arbeiter fertig sind

  1. x Arbeiter Aufgaben erstellen
  2. ein paar Sachen
  3. Warten Sie, bis alle Arbeiter Aufgaben
  4. fertig
  5. Gehen

Ich schrieb dieses Stück 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 

Während dieser Code so weit funktioniert, fühle ich mich wie es ist keine gute Praxis. Würden Sie mir ein paar Tipps geben, wie Sie dieses Problem besser lösen können? Vielen Dank!

+1

'Task.WaitAll (workerTasks. ToArray()) '? Oder 'Task.WhenAll (...)'? –

+0

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

Antwort

2

können Sie Task.WaitAll() statt:

Task.WaitAll(workerTasks.ToArray()); 

Oder für async Methoden:

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

Oder geben die Aufgabe an den Anrufer:

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