Я не уверен, что какие-либо стандартные механизмы блокировки или синхронизации потоков действительно будут работать с таким количеством потоков. Однако это может быть сценарий, в котором некоторые базовые сообщения могут быть идеальным решением проблемы.
Вместо использования Thread.Join, который блокирует (и может быть очень трудно управлять с таким количеством потоков), вы можете попробовать настроить еще один поток, который объединяет сообщения о завершении из ваших рабочих потоков. Когда агрегатор получил все ожидаемые сообщения, он завершается. Затем вы можете использовать один WaitHandle между агрегатором и основным потоком приложения, чтобы сигнализировать, что все ваши рабочие потоки выполнены.
public class WorkerAggregator
{
public WorkerAggregator(WaitHandle completionEvent)
{
m_completionEvent = completionEvent;
m_workers = new Dictionary<int, Thread>();
}
private readonly WaitHandle m_completionEvent;
private readonly Dictionary<int, Thread> m_workers;
public void StartWorker(Action worker)
{
var thread = new Thread(d =>
{
worker();
notifyComplete(thread.ManagedThreadID);
}
);
lock (m_workers)
{
m_workers.Add(thread.ManagedThreadID, thread);
}
thread.Start();
}
private void notifyComplete(int threadID)
{
bool done = false;
lock (m_workers)
{
m_workers.Remove(threadID);
done = m_workers.Count == 0;
}
if (done) m_completionEvent.Set();
}
}
Обратите внимание, я не проверял приведенный выше код, поэтому он может быть неверен на 100%. Тем не менее, я надеюсь, что это иллюстрирует концепцию достаточно, чтобы быть полезным.