Я буду ссылаться на:
//Call 1
WriteText();
//Call 2
await WriteTextAsync();
//Call 3
WriteTextAsync().Wait();
При первом вызове проблем не возникает, если вы хотите сделать синхронное ожидание.В консольном приложении это вполне нормально.
Проблема возникает в программах с пользовательским интерфейсом или в тех, которые требуют наилучшего использования ресурсов ЦП, наиболее распространенным случаем являются веб-приложения.
Вызов 2 с использованием await
выполняет асинхронное ожиданиеза результат WriteTextAsync
.Само по себе это нормально и считается нормальным.Тем не менее, WriteTextAsync
является очень хорошим примером того, что вы должны никогда делать:
static async Task WriteTextAsync()
{
// Let's create a Thread
await Task.Run(() =>
{
// just to block it completely, having it do nothing useful
Thread.Sleep(3_000);
Console.WriteLine("Hello");
});
}
Скорее, автор должен был использовать:
static async Task WriteTextAsync()
{
// Let's *not* create a new thread
await Task.Delay(3_000);
Console.WriteLine("Hello");
}
Возможноони должны были указать на это дальше, но вы не дали нам название книги, чтобы знать это.
Вызов номер 3 - это то, что вам нужно сделать, когда вызывающий метод не может быть * 1021.* один, и вам нужно вызвать async
метод, так:
// Think that for some reason you cannot change the signature,
// like in the case of an interface, and an async void would make your code
// never complete correctly
static void Main(string[] args)
{
//Call 3
WriteTextAsync().Wait();
}
В целом, я бы посоветовал вам найти лучшую книгу.Примеры легче понять, когда фактически требуется асинхронный код.