Почему async/await выполняются синхронно? - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, Гуру! Немного запутался в логике работы async/await, очень прошу просветить..) Есть несколько асинхронных методов, выполняющихся синхронно в одном таске, хотелось бы понять почему. Как я это понимаю: -В строке 1 синхронно запускается метод MethodCaller() -В строке 2 MethodCaller() возвращает в Main() незавершенный Task и запускает MethodA() в новом потоке, в то время как основной поток выполняет строку 3. Но все выполняется полностью синхронно, т.е. строка 3 выполняется последней. Почему? P.S. И еще один вопрос: асинхронные методы идут каскадом, скажем, десяток асинхронных методов дергает один другой. При каждом встреченном await из пула будет извлекаться поток?
 
 
        private static void Main()
        {
            MethodCaller(); //1
            Console.WriteLine($"Task - {Task.CurrentId}: Main do work"); //3
            Console.ReadKey();
        }
 
        private static async Task MethodCaller()
        {
            Console.WriteLine($"Task - {Task.CurrentId}: Start MethodCaller()");
            var myNum = await MethodA(); //2
            Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodCaller(), {myNum}");
        }
 
        private static async Task<int> MethodA()
        {
            Console.WriteLine($"Task - {Task.CurrentId}: Start MethodA()");
            var result = await MethodB(); 
            Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodA()");
            return result;
        }
 
        private static async Task<int> MethodB()
        {
            Console.WriteLine($"Task - {Task.CurrentId}: Start MethodB()");
            var randomNumber = new Random().Next(5, 10);
            Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodB()");
            return randomNumber;
        }

Решение задачи: «Почему async/await выполняются синхронно?»

textual
Листинг программы
        CancellationTokenSource cancelTokSrc = new CancellationTokenSource();
        Task tsk = Task.Factory.StartNew(MethodCaller, cancelTokSrc.Token, cancelTokSrc.Token); //1
        try
        {
            cancelTokSrc.Cancel();
            tsk.Wait();
        }
        catch(AggregateException aex)
        {
            // todo:
        }
        catch (Exception ex)
        {
 
        }
        finally
        {
            tsk.Dispose();
            cancelTokSrc.Dispose();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5