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
}

questionAnswers(2)

yourAnswerToTheQuestion