@crescent

Почему тут await не ждет?

public async void test()
        {
                await PrintAsync();
                Console.WriteLine("finish");
                Console.ReadKey();
                
        }




        void Print()
        {
            Thread.Sleep(3000);     // имитация продолжительной работы
            Console.WriteLine("Hello METANIT.COM");
        }

        // определение асинхронного метода
        async Task PrintAsync()
        {
            Console.WriteLine("Начало метода PrintAsync"); 
            await Task.Run(() => Print());               
            Console.WriteLine("Конец метода PrintAsync");

        }


Вызываю метод test() и он сразу завершается
А я хочу чтоб сперва выполнился PrintAsync и только после его завершения написалось бы Console.WriteLine("finish");

Как это сделать??
  • Вопрос задан
  • 152 просмотра
Решения вопроса 2
freeExec
@freeExec
Участник OpenStreetMap
Потому что твоя программа завершается ещё до окончания работы таска.
Ответ написан
vabka
@vabka Куратор тега C#
Токсичный шарпист
await ждёт, но ждёт он только внутри test.
То что вызвало test не имеет возможности дождаться, тк test объявлен как async void => вернёт управление сразу же, как только выполнение дойдёт до строчки await Task.Run
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
public class Program {
    static async Task Main(string[] args) {
        Console.WriteLine("Hello, World!");
        var p = new Program();
        await p.Test();
        Console.WriteLine("Конец метода Main");
    }
    public async Task Test() {
        await PrintAsync();
        Console.WriteLine("finish");
        Console.ReadKey();

    }
    void Print() {
        Thread.Sleep(3000); // имитация продолжительной работы
        Console.WriteLine("Hello METANIT.COM");
    }

    async Task PrintAsync() {
        Console.WriteLine("Начало метода PrintAsync");
        await Task.Run(() => Print());
        Console.WriteLine("Конец метода PrintAsync");
    }
}

Все ждет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы