Я не уверен, что это то, что вам нужно, но вот простое решение, которое я использовал в .NET 3.0, чтобы убедиться, что большое, но детерминированное количество потоков завершено, прежде чем продолжить:
Global:
AutoResetEvent threadPoolComplete = new AutoResetEvent(false);
static int numThreadsToRun;
Как вы активируете темы:
numThreadsToRun = [number of threads];
[start your threads];
threadPoolComplete.WaitOne();
В конце кода каждого потока:
if (Interlocked.Decrement(ref numThreadsToRun) == 0)
{
threadPoolComplete.Set();
}