C #: aguardando a conclusão de todos os threads

Estou executando um padrão comum no código que estou escrevendo, onde preciso aguardar a conclusão de todos os threads de um grupo, com um tempo limite. O tempo limite deve ser o tempo necessário paratudo Threads para concluir, basta executar thread.Join (timeout) para cada thread não funcionará, já que o tempo limite possível é timeout * numThreads.

No momento, faço algo como o seguinte:

var threadFinishEvents = new List<EventWaitHandle>();

foreach (DataObject data in dataList)
{
    // Create local variables for the thread delegate
    var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
    threadFinishEvents.Add(threadFinish);

    var localData = (DataObject) data.Clone();
    var thread = new Thread(
        delegate()
        {
            DoThreadStuff(localData);
            threadFinish.Set();
        }
    );
    thread.Start();
}

Mutex.WaitAll(threadFinishEvents.ToArray(), timeout);

No entanto, parece que deve haver um idioma mais simples para esse tipo de coisa.