Я сразу извиняюсь за неточную формулировку вопроса, но не смог как-то конкретно его сформулировать. Вопрос по асинхронности. Я сразу привожу код, думаю для программиста средней руки он более чем понятен, но вот я не совсем пойму результат его вывода.
Вот код:
class Program
{
static Random random = new Random();
static void Main(string[] args)
{
Console.WriteLine("Сколько запросов отправить?");
int count = int.Parse(Console.ReadLine());
Task<string>[] taskMas = new Task<string>[count];
for (int i = 0; i < count; i++)
{
taskMas[i] = Task.Run<string>(() => GetData(i));
}
Console.WriteLine("Все задачи отправлены");
Task.WaitAll(taskMas);
foreach(Task<string> task in taskMas)
{
Console.WriteLine(task.Result);
}
Console.WriteLine("Программа выполнилась");
}
static string GetData(int id)
{
int delay = random.Next(0, 1500);
int myId = id;
Thread.Sleep(delay);
return $"Запрос {myId} выполнялся {delay}";
}
}
Есть как-бы запросы, которые могут выполняться случайное время. При этом, я не жду пока выполниться каждый запрос, а получаю, как удобно это представлять - "обязательства" по выполнению каждого запроса, т.е. метода, которые выдаются сразу. Потом я жду с помощью метода WaitAll когда все обязательства (Task) будут выполнены и я запрашиваю у каждого из них результат работы.
Вот результат работы программы:
Сколько запросов отправить?
10
Все задачи отправлены
<Вот тут идет пауза пока методы выполняются>
Запрос 10 выполнялся 162
Запрос 10 выполнялся 171
Запрос 10 выполнялся 1267
Запрос 10 выполнялся 307
Запрос 10 выполнялся 184
Запрос 10 выполнялся 722
Запрос 10 выполнялся 762
Запрос 10 выполнялся 101
Запрос 10 выполнялся 1424
Запрос 10 выполнялся 1044
Программа выполнилась
Здесь похоже какая-то банальная вещь, которую я не могу понять, почему id то одинаковые? Я вроде бы уже и сохраняю их в отдельной переменной в методе, но они все равно равняются последнему идентификатору с которым был вызван данный метод. Но смущает, что задержка, то абсолютно честно отработала и у всех запросов она разная. Вот подскажите, что я здесь не верно сделал?