C #, для цикла внутри параллели для цикла не работает правильно - PullRequest
0 голосов
/ 27 июня 2018

Это мой код, и он работает неправильно.

Нормально для цикла от 0 до UrlList Count. Возможно 1500 - 2000;

После каждых 10 циклов, контролируя сеанс. Если не существует или тайм-аут, собирается и обновить. И эта точка первого параллельного цикла работает правильно. я = 10 и х = от 0 до 9.

И позже, параллельно не работает. Я смотрю с "добавить часы" для х. х не меняется. Последнее число в первом цикле остается тем, чем оно является.

Что я могу сделать?

TokenController control = new TokenController();
for (int i = 0; i < UrlList.Count; i++)
{
    if(control.SessionControl(false, 0))
    {
       Parallel.For(i, 10, x => {
          //HttpRequest

       });

       i += 9;
    }
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Похоже, у вас проблемы с диапазонами ; в зависимости от того, что вы хотите, это либо

 for (int i = 0; i < UrlList.Count; i++) {
   // at 0th, 10th, 20th ... N * 10 ... position 
   if (i % 10 == 0) {
     // Control session: 
     // HttpRequest ...
   }
 } 

или

 int step = 10;

 for (int i = 0; i < UrlList.Count; ++i) {
   // Control session can appear at any moment, indepent on i 
   if (control.SessionControl(false, 0)) {
     // When we at i-th postion we want 10 loops more: i + step
     // not from i to step
     Parallel.For(i, i + step, x => {
      //HttpRequest
     });

     i += (step - 1);
   }
 }
0 голосов
/ 27 июня 2018

Второй параметр для Parallel.For - это значение «to» (исключающее), а не «число повторений»:

public static ParallelLoopResult For(
    int fromInclusive,
    int toExclusive,
    Action<int> body
)

В вашем коде это означает, что после первой итерации значение from будет равно или больше значения to.

Итак, ваш код должен быть:

Parallel.For(i, i + 10, x => {
   //HttpRequest

});
...