Обнаружение завершения массива потоков

Я создал массив потоков и запустил всех их. Как знать, завершили ли все потоки работу. Я не хочу использовать thread.wait или thread.join.

10
задан John Saunders 14 May 2010 в 12:58
поделиться

7 ответов

Что ж, вы можете протестировать Thread.IsAlive - но, конечно, это устареет, как только вы его протестируете. Вы можете сохранить список «активных в настоящее время» потоков и удалять их по одному, когда они останавливаются, спящие между тестовыми запусками. Для более подробной информации вы можете использовать Thread.ThreadState .

Что здесь общего? Чего вы пытаетесь достичь, и почему вы не хотите вызвать Thread.Join (возможно, с таймаутом)?

2
ответ дан 4 December 2019 в 03:38
поделиться

Если вы используете .NET 4, вы можете использовать параллельную библиотеку задач и метод ContinueWhenAll .

Вам нужно будет изменить ваши потоки, чтобы они были представлены как задачи . С задачами легче работать, чем с потоками. Обычно вам не нужно беспокоиться о низкоуровневых вещах, поскольку вы вынуждены делать это сейчас, например, о планировании или ожидании завершения.

4
ответ дан 4 December 2019 в 03:38
поделиться

Вы можете использовать класс ThreadPool вместо массива и использовать метод GetAvailableThreads, чтобы проверить, все ли потоки доступны. См .:

ThreadPool класс .

0
ответ дан 4 December 2019 в 03:38
поделиться

, если вы хотите перехватить работу асинхронно, вы можете использовать BackgroundWorkers, все из которых иметь событие RunWorkerCompleted и свойства Error и Canceled в аргументах события

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

0
ответ дан 4 December 2019 в 03:38
поделиться

С какой целью? Диагностика? Console.WriteLine.

Если нет, используйте глобальную переменную (например, доступную для всех потоков), увеличивайте ее при запуске одного из ваших потоков и уменьшайте при завершении. Если 0, все потоки завершили работу, но вы должны быть осторожны, чтобы синхронизировать его правильно, иначе вы получите ложные срабатывания. После запуска ваши потоки выполните:

while (runningThreadsCount > 0)
{
    // There are still working threads
}
-1
ответ дан 4 December 2019 в 03:38
поделиться

Пусть потоки возвращаются к классу, в котором вы их запустили, чтобы сообщить, что они завершены

0
ответ дан 4 December 2019 в 03:38
поделиться

Как насчет MyThread.ThreadState == System.Threading.ThreadState.Stopped ?

0
ответ дан 4 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: