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