Не могу понять как работает асинхронность в C#, сколько ни читаю, ни смотрю, ну не доходит до меня. Чтобы в этом деле разобраться, решил я составить себе учебный пример. Вот код:
class Program
{
static async Task<int> LongMath1(int n)
{
Console.WriteLine("Start 1");
return await Task.Run(() =>
{
Thread.Sleep(10000);
return n * n;
});
}
static async Task<int> LongMath2(int n)
{
Console.WriteLine("Start 2");
return await Task.Run(() =>
{
Thread.Sleep(8000);
return n * n;
});
}
static async Task<int> LongMath3(int n)
{
Console.WriteLine("Start 3");
return await Task.Run(() =>
{
Thread.Sleep(6000);
return n * n;
});
}
static void Main(string[] args)
{
// Что тут написать надо?
}
}
Задача такая. Есть три "долгие" операции. Я хочу стартовать их одновременно. Пусть в этом примере они и не представляют из себя ничего полезного, но допустим, они обращались бы к каким нибудь АПИ или делали запросы к разным БД. А потом, когда все три получат данные, я бы хотел их как то обработать. Но это уже не важно. Важно то, что я хотел бы запустить операции ОДНОВРЕМЕННО. Пусть главный поток заблокируется, но когда его "отпустит" я буду иметь данные из всех трех операций. Преимущество тут мне видится, в том, что вместо 24ех секунд, при параллельном запуске, все это дело выполнялось бы 10 секунд (длительность максимально долгой операции см код)
Вопрос, правильно ли я собираюсь использовать асинхронность для описанной мою ситуации и что нужно написать в Main, чтоб заработало?
P.S.
Если оформить Main вот таким образом:
static async Task Main(string[] args)
{
// моя обработка данных
int res1 = await LongMath1(5);
int res2 = await LongMath2(6);
int res3 = await LongMath3(7);
Console.WriteLine(res1 + res2 + res3);
}
То все выполняется синхронно. Как тогда, если не так?
Taskположи в массив и воспользуйся Task.WaitAll(Task[]). https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.waitall – Иван Jun 11 '19 at 22:01