Я создал массив потоков и начал их все. Как узнать, завершили ли все потоки работу. Я не хочу использовать thread.wait или thread.join.
Обнаружение завершения массива нитей
Ответ 1
Ну, вы можете проверить Thread.IsAlive
- но это будет устаревшим, как только вы его протестировали, конечно, Вы можете сохранить список "живых" потоков и удалить их по одному, когда они останавливаются, спящий между прогонами. Для получения более подробной информации вы можете использовать Thread.ThreadState
.
Какая большая картина здесь? Что вы пытаетесь достичь, и почему вы не хотите вызывать Thread.Join
(возможно, с таймаутом)?
Ответ 2
Если вы используете .NET 4, вы можете использовать параллельную библиотеку задач и ContinueWhenAll.
Вам нужно будет изменить свои потоки, чтобы они были представлены как Task. Задачи легче работать с потоками. Обычно вам не нужно беспокоиться о вещах более низкого уровня, поскольку вы вынуждены делать это сейчас, как планирование или ожидание завершения.
Ответ 3
Как насчет MyThread.ThreadState == System.Threading.ThreadState.Stopped?
Ответ 4
Вы можете использовать класс ThreadPool вместо массива и использовать метод GetAvailableThreads, чтобы проверить, доступны ли все потоки. См:
Ответ 5
Попросите потоки вернуться к классу, в котором вы их запустили, чтобы сообщить, что они сделаны.
Ответ 6
если вы хотите перехватить работу асинхронно, вы можете использовать BackgroundWorkers, все из которых имеют событие RunWorkerCompleted и свойства Error and Canceled в аргументе args
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
Ответ 7
С какой целью? Диагностика? Console.WriteLine.
Если нет, используйте глобальную переменную (как в: доступной для всех потоков), увеличивайте ее, когда начинается один из ваших потоков, уменьшается при завершении. Если 0, все потоки завершили работу, но вы должны быть осторожны, чтобы синхронизировать ее правильно, иначе вы получите ложные срабатывания. После того, как вы начнете создавать темы, выполните следующие действия:
while (runningThreadsCount > 0)
{
// There are still working threads
}