0

Не могу понять как работает асинхронность в 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);
}

То все выполняется синхронно. Как тогда, если не так?

Aleksej_Shherbak
  • 592
  • 4
  • 23
  • 1
    Все три Task положи в массив и воспользуйся Task.WaitAll(Task[]). https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task.waitall – Иван Jun 11 '19 at 22:01
  • @John я посмотрел пример по ссылке. Я так делал, и задачи действительно запускаются одновременно. Но я не понимаю, как мне получить результаты их работы. Я что-то упускаю? – Aleksej_Shherbak Jun 11 '19 at 22:18
  • 2
    Task.Result в вашем случае или можно складывать результат в какую-нибудь общую Concurrent коллекцию. – Иван Jun 11 '19 at 22:29
  • 1
    @John Это сработало! Не хотите оформить как ответ? – Aleksej_Shherbak Jun 11 '19 at 22:39
  • 1
    Поглядите ответ тут https://ru.stackoverflow.com/questions/752573/%d0%a3%d0%b2%d0%b5%d0%bb%d0%b8%d1%87%d0%b8%d1%82%d1%8c-%d1%81%d0%ba%d0%be%d1%80%d0%be%d1%81%d1%82%d1%8c-%d0%bf%d0%b0%d1%80%d1%81%d0%b5%d1%80%d0%b0/752593#752593 – tym32167 Jun 11 '19 at 22:41

0 Answers0