Вы можете создать событие (например, ManualResetEvent
) в каждом потоке и сохранить его в синхронизированном списке (используя конструкцию lock
). Установите событие или удалите его из списка после завершения задачи.
Если вы хотите присоединиться, вы можете использовать WaitHandle.WaitAll
( документация MSDN ), чтобы дождаться оповещения обо всех событиях.
Это хак, но я не понимаю, как свести это к чему-то более простому!
Редактировать: кроме того, вы можете убедиться, что новые события не публикуются, а затем подождать пару секунд. Если они действительно недолговечны, у вас не будет проблем. Еще проще, но более хакерски.
Наконец, если это всего лишь короткий промежуток времени, служба не завершит работу, пока все потоки не прекратятся (если они не являются фоновыми потоками); так что если это короткий промежуток времени, менеджер службы контроля не будет возражать, или около того - вы можете просто оставить их до истечения срока действия - по моему опыту.