• Как работают цепочки await в C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Я много раз читал, что если await встречает Таск, который ещё не выполнен, то метод возвращает незавершённый таск и выполнение продолжается в вызывающем методе.

    Видимо, вы не дочитали, либо недопоняли.

    Возьму ваш первый пример, но немного его видоизмению, чтобы было понятнее, что проиходит:
    static async Task Method1Async()
            {
                Console.WriteLine("Starting Method1Async Thread id: "+ Thread.CurrentThread.ManagedThreadId);
                var task = Method2Async();
                await task; // До этой точки код выполняется синхронно (если таска ещё не готова)
                Console.WriteLine("End Method1Async Thread id: " + Thread.CurrentThread.ManagedThreadId);
            }
            
            static async Task Method2Async()
            {
                Thread.Sleep(100); // Thread.Sleep - это блокирующая операция
                Console.WriteLine("Starting Method2Async Thread id: "+ Thread.CurrentThread.ManagedThreadId);
                await Task.Yield(); // До этой точки код выполняетя синхронно. Task.Yield освобождает поток всегда
                Console.WriteLine("End Method2Async Thread id: " + Thread.CurrentThread.ManagedThreadId);
            }

    Подробнее можете узнать, если загуглите TAP.docx
    Ответ написан
    Комментировать