Почему в Task приходит неверный параметр?

279
31 августа 2017, 16:57

Начал изучать работу с Task в C#, т.к. есть у меня задача, где в цикле делаются достаточно длительные запросы через Web API к сторонним сервисам, а потом результаты заносятся в базу данных. Хотел распараллелить выполнение этих запросов через Tasks, но оказалось не все так просто. Даже простейшая тестовая задача по передаче параметров в Task поставила в тупик.

static void Main(string[] args)
{
    List<Task> tasks = new List<Task>();
    Console.WriteLine("Start");
    for (int i = 0; i < 3; i++)
    {
        tasks.Add(Task.Run(() => printIdx(i)));
    }
    Console.WriteLine("Begin waiting");
    Task.WaitAll(tasks.ToArray());
    Console.WriteLine("End waiting");
}
static void printIdx(int j)
{
    Console.WriteLine(j + "\tstart");
    System.Threading.Thread.Sleep(500);
    Console.WriteLine(j + "\tend");
}

Результат выполнения такой:

Start
Begin waiting
3 start
3 start
3 end
3 start
3 end
3 end
End waiting

Получается, что фактическая передача значения параметра происходит уже после окончания цикла. Подскажите, как правильно передавать параметры в таком случае?

Answer 1

Сделайте копию вашей переменной

for (int i = 0; i < 3; i++)
{
    var t = i;
    tasks.Add(Task.Run(() => printIdx(t)));
}
READ ALSO
Одинарный вывод сообщения в цикле foreach - C#

Одинарный вывод сообщения в цикле foreach - C#

Есть некий код банкомата, где пользователю необходимо сначала ввести свой ид

356
Массив с ключами javascript

Массив с ключами javascript

Мне нужно сделать массив который хранит данные, знаю что можно сделать так

315
Возможно ли обращаться к woocommerce напрямую, без сервера и аутентификации?

Возможно ли обращаться к woocommerce напрямую, без сервера и аутентификации?

Здравствуйте, в woocommerce никак не могу найти способа работы с плагином без аутентификации (только get запросы нужны), возможно ли как-то напрямую...

326
Ajax запрос error

Ajax запрос error

Добрый деньСтолкнулся со следующей проблемой:

380