Я бы посоветовал вам прочитать сообщение в блоге Стивена Клири для довольно исчерпывающего объяснения того, что такое async / await.
Однако конкретно на ваш вопрос, использование of async
в сигнатуре метода предлагает компилятору создать конечный автомат. Вы должны поместить ключевое слово async
в метод, чтобы разрешить использование await
в теле метода (как вы, вероятно, обнаружили при написании Waiter()
и HeavyStuff()
).
Что в конечном итоге произойдет вот когда вы вызываете Waiter из Main, он действительно вызывает метод Waiter, но поскольку вы не ожидаете результата вызова, он обрабатывает его как «выстрелил и забыл». Таким образом, вы испытываете закрытие программы.
Аналогичным образом, пока Waiter()
ожидает HeavyStuff()
(если Waiter () ожидали от Main()
), программа будет ждать возврата этого метода, прежде чем отобразить «1» на консоли.
Сообщение в блоге выше описывает это, но вы, вероятно, не захотите возвращать void из Waiter()
, потому что это обычно используется для обработки событий, когда на самом деле ничего не ожидает результата метод. Пока вы не возвращаете значение с помощью своего метода, вы его ожидаете, поэтому лучше вместо этого возвращать Task.
Начиная с C# 7.1, вам разрешено использовать ключевое слово async
в вашей точке входа Main()
, поэтому ваш код должен быть следующим:
class Program
{
static async Task Main(string[] args)
{
await Waiter();
}
public static async Task Waiter()
{
await HeavyStuff();
Console.WriteLine("1");
}
public static async Task HeavyStuff()
{
await Task.Delay(1000);
Console.WriteLine("2");
}
}