0

у меня есть следующий код:

var workers = new Task<string>[workersCount];
var urls = new string[workersCount];
while (Numbers.HasNext)
{
    for (int i = 0; i < workersCount; i++)
    {
        urls[i] = $"{URL}{id}_{Numbers.Get()}";

        workers[i] = new Task<string>(() =>
        {
            using (var wb = new WebClient())
            {
                wb.Encoding = encoding;
                return wb.DownloadString(urls[i]);
            }
        });

        workers[i].Start();
    }

    Task.WaitAll(workers);
}

workersCount = 5. На вызове Task.WaitAll(workers) я получаю: System.IndexOutOfRangeException: "Index was outside the bounds of the array." При отладке видно, что в момент исключения переменная i = 5, хотя такого быть не должно. Где может происходить еще один инкремент и как это исправить?

  • Что у вас первый цикл while делает? –  Aug 02 '18 at 08:22
  • у меня есть класс Numbers, его метод Get отдает int. т.к чисел очень много и их хранить нигде нельзя, он генерирует их налету при вызове Get. HasNext - bool свойство. т.е цикл while выполняется пока у Numbers есть числа. – user9301309 Aug 02 '18 at 08:47
  • "При отладке видно, что в момент исключения переменная i = 5, хотя такого быть не должно." Почему такое быть не должно? Цикл for увеличил переменную i с 4 до 5, потом проверил условие- условие не выполнилось, произошел выход из цикла –  Aug 02 '18 at 08:53
  • 1
    Зачем сздавать таск для синхронной операции, если можно сразу вызвать асинхронную? – tym32167 Aug 02 '18 at 08:57
  • 1
    А что касается вашей проблемы - классичаская ошибка с замыканием переменной i. Перед созданием таска сохраните var temp = i;, и внутри таска пользуйтесь переменной temp – tym32167 Aug 02 '18 at 08:59
  • "Зачем сздавать таск для синхронной операции, если можно сразу вызвать асинхронную?" необходимо было дать пользователю изменять количество воркеров(тасков). страниц очень много, и создавать миллиарды тасков сразу, не хочется. – user9301309 Aug 02 '18 at 09:03
  • Так не создавайте миллиарды, создавайте сколько надо, это никак не противоречит ни моему коментарию, ни ответу по моей ссылке. – tym32167 Aug 02 '18 at 09:13

0 Answers0