2012-01-20 2 views
1

Я хочу, чтобы основной поток порождал потоки и мог продолжать нереститься, ожидая окончания всех нитей. Нерест нитей контролируется пользователем, поэтому пользователь может добавлять в разные периоды больше потоков.Основная нить ждет потоков в финализации C#

Вещь ... как я могу это сделать, когда основной поток запускает финализацию. В финализации заставьте его ждать, пока все активные потоки не закончатся.

+1

Это о правильном использовании метода .join()? – Ismael

+2

Что-то не хватает в вашем вопросе: вы сказали, что пользователь может добавлять потоки в разные периоды времени. Мой вопрос: что будет делать основной поток во время ожидания пользователя? Как основной поток знает, что у пользователя больше нет нитей для добавления? –

ответ

2

Следите за всеми созданными вами темами; например, через коллекцию 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, завершают выполнение. Аналогично для сбора мусора; ваши объекты кучи не будут завершены до тех пор, пока они больше не будут ссылаться на на любую живую нить, а не только на главную.

+0

Мне действительно не нужен Thread.Join, так как я не требую никаких возвратов из потоков. Все, что мне нужно, - это чтобы основной поток был готов получать все больше и больше потоков, пока порожденные потоки выполняют эту работу. Это так забавно, что код, который у меня есть, отлично работает. Я отсутствовал, это IsBackground = false; линия. У меня было это в правдивости, поэтому, когда основной поток завершался, порожденные потоки пошли с ним. – user1161221

+0

Использование термина «фон» в этом контексте вводит в заблуждение. Обычно разработчики предполагают, что все потоки являются фоновыми, кроме основного. Рад помочь! – Douglas

Смежные вопросы