Existe um C # equivalente ao Java CompletionService para reagir aos threads concluídos?
Existem muitos exemplos de como aguardar a conclusão de todos os trabalhos de 'trabalhador', mas que tal reagir à medida que cada trabalhador é concluído da mesma maneira que o CompletionService do Java?
Eu hackeei algo que funciona, mas isso parece frágil:
int completedWorkers = 0;
while (completedWorkers < workerCount)
{
int eventId = WaitHandle.WaitAny(eventArray);
events[eventId].Reset();
completedWorkers++;
Console.WriteLine("Worker {0} has completed. {1} have now completed.", eventId, completedWorkers);
}
Console.WriteLine("All threads have finished");
Isso depende de uma matriz de instâncias ManualResetEvent ('eventArray' no meu exemplo), semelhante à mostrada no exemplo da Microsoft,http://msdn.microsoft.com/en-us/library/3dasc8as.aspx (no entanto, o código deles usa WaitAll () para aguardar a conclusão de todos os trabalhadores, não reagindo à medida que cada trabalhador termina).
Editar:
Aceitei a resposta de Douglas usando o TPL, mas, para referência, os delegados nos fornecem essa funcionalidade imediatamente:
IAsyncResult result = caller.BeginInvoke(
new AsyncCallback(CallbackMethod),
"The call executed on thread {0}, with return value \"{1}\".");
...
void CallbackMethod(IAsyncResult ar)
{
// 'react' to async delegates completing
}