1) Как узнать, завершены ли все темы?
Вам нужно будет разрешить потокам выполнять свою собственную регистрацию / выписку, заключив код в скобки между:
Interlocked.Increment(ref jobCounter);
// your code
Interlocked.Decrement(ref jobCounter);
Если это слишком запутывает ваших анонимных делегатов, просто используйте методы-обертки. Возможно, вам также придется добавить обработку исключений.
Взаимосвязанный подход по-прежнему избавляет от проблемы ожидания, когда он станет равным 0, цикл с Sleep () является слабым, но в данном случае жизнеспособным решением.
2) Вы запускаете темы в рекурсивном обходчике деревьев. Будьте осторожны, вы, вероятно, создаете их слишком много, и это ухудшит производительность.