Пока цикл или цикл For не выходят - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать поток и добавить его в список потоков:

int j = 0;
while(j!=6)
    {
        Thread th = new Thread(() => SaveImages(L104List[j], folderFilePath, bw));
        ThreadList.Add(th);
        j++;
        //th.Start();
     }

, но он не завершается, когда j становится равным 6. Поэтому он выдает исключение:

Дополнительная информация: индекс был вне диапазона.Должен быть неотрицательным и меньше размера коллекции.

НО, всякий раз, когда я пытаюсь использовать точки останова для ручной итерации цикла, он завершается и переходит к следующим операторам кода.Почему он это делает?

PS.Я также пытался за цикл, и это также делает это.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Я сделаю что-то вроде этого:

foreach(var data in L104List)
{
   string local = data;
   ThreadStart work = delegate { SaveImages(local, folderFilePath, bw); };
   new Thread(work).Start();
}
0 голосов
/ 31 января 2019

Хмм

  • Для начала у вас будет Захват с вашим Закрытием .

  • Ваши while петли кажутся идеальным случаем для for или foreach петли

  • Я еще не уверен, что вам нужно использовать Threadкласс для этого, или что будет оптимальным, если вы делаете.Почему бы не использовать Task вместо этого.

  • Делая этот шаг дальше, почему бы не позволить TPL сделать тяжелую работу за вас

Пример простого параллелизма

Parallel.ForEach(L104List, (item) => SaveImages(item, folderFilePath, bw));

Преимущества:

  • У вас не будет проблемы с закрытием переменной цикла
  • У вас нетнужно беспокоиться о неэффективном переключении потоков, когда вы перегружаете свой процессор
  • Планировщик задач будет выделять потоки из пула потоков таким образом, что, скорее всего, будет более эффективным, чем запускать столько потоков, сколько содержит ваш массив.
  • он будет ждать, пока вся ваша работа не будет выполнена
  • Одна строка кода и его легче понять

Дополнительные примечания: если вы можете сделать свой метод асинхронным, вы, вероятно, можетеполучить еще большую эффективность


Метод Parallel.ForEach

Выполняет операцию foreach (для каждого в Visual Basic), в которой итерации могут выполняться параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...