Задать вопрос

Как правильно дождаться выполнения всех потоков, созданных в цикле?

Пожалуйста. подскажите:
Есть потоки, создаваемые в цикле. Все они должны выполняться параллельно, но при этом дальнейшее выполнение кода после потока должно происходить только по завершении всех этих потоков.
Код примерно такой:

List<Thread> lstThread = new List<Thread>();
 while (currentItemMonth <= this.lastMonth)
{

                            GeneratorItemSheet g = new GeneratorItemSheet(sh);
                            Thread myThread = new Thread(new ThreadStart(g.GenerateMonthSheet));
                            myThread.Start();
                            lstThread.Add(myThread);

                            //Переходим на следующий месяц
                            currentItemMonth = currentItemMonth.AddMonths(1);
}

foreach (Thread thread in lstThread)
{
      if (thread.IsAlive) thread.Join();
}


Т е складываю все потоки в лист, а потом циклом делаю им join.
Вопрос: Правильный ли это способ или надо как-то иначе. Просто у меня уходит в зависание, понять бы, это оттого, что идея в принципе неправильная или идея правильная, но хромает реализация внутри метода, вызываемого в потоке.
  • Вопрос задан
  • 4304 просмотра
Подписаться 5 Простой Комментировать
Ответ пользователя eRKa К ответам на вопрос (3)
@kttotto
пофиг на чем писать
У Вас не правильный подход. Во первых забудьте про Thread и используйте TPL. Во вторых для распараллеливания запросов в цикле есть замечательный метод Parallel.ForEach. В третьих для ожидания выполнения всех параллельных задач есть Task.WaitAll.
В общем Вы можете создать список Task-ов и запихнуть их в Task.WaitAll, но лучше пройдитесь параллельным форичем по Вашему периоду и внутри запускайте Ваши методы. Код за форичем будет ожидать завершения всех потоков в цикле.
Ответ написан