Начал изучать работу с 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
Получается, что фактическая передача значения параметра происходит уже после окончания цикла. Подскажите, как правильно передавать параметры в таком случае?
Сделайте копию вашей переменной
for (int i = 0; i < 3; i++)
{
var t = i;
tasks.Add(Task.Run(() => printIdx(t)));
}
Продвижение своими сайтами как стратегия роста и независимости