Следите за всеми созданными вами темами; например, через коллекцию List<Thread>
. Когда вы находитесь в вашем методе finalize
, просто перебрать всех потоков и вызвать их Join
метод последовательно, как показано на WaitForThreads
метод ниже:
private readonly List<Thread> threads = new List<Thread>();
public void SpawnThread(Action action)
{
Thread thread = new Thread(new ThreadStart(action));
thread.IsBackground = false;
threads.Add(thread);
thread.Start();
}
private void WaitForThreads()
{
foreach (Thread thread in threads)
thread.Join();
}
Thread.Join
блокирует вызывающий поток (который должен быть ваш основной поток) пока не закончится конкретный поток. Если поток уже был завершен, вызов немедленно вернется (именно поэтому вам действительно не нужно удалять потоки из коллекции после завершения, хотя вы все равно должны ради сбора мусора).
Кроме того, вы должны рассмотреть , почему вам нужно дождаться окончания потоков в пределах вашего метода finalize
. Если это просто, чтобы предотвратить их насильственное прерывание, когда ваш основной поток завершается, тогда нет необходимости; ваш процесс останется в живых (даже без окна) до тех пор, пока все потоки, чье свойство IsBackground
равно false
, завершают выполнение. Аналогично для сбора мусора; ваши объекты кучи не будут завершены до тех пор, пока они больше не будут ссылаться на на любую живую нить, а не только на главную.
Это о правильном использовании метода .join()? – Ismael
Что-то не хватает в вашем вопросе: вы сказали, что пользователь может добавлять потоки в разные периоды времени. Мой вопрос: что будет делать основной поток во время ожидания пользователя? Как основной поток знает, что у пользователя больше нет нитей для добавления? –