Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю Страница 299
- Категория: Компьютеры и Интернет / Базы данных
- Автор: Троелсен Эндрю
- Страниц: 642
- Добавлено: 2023-08-26 14:00:22
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту pbn.book@yandex.ru для удаления материала
Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю» бесплатно полную версию:В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.
Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю читать онлайн бесплатно
await Task.WhenAny(task1, task2, task3);
В результате вывод становится таким:
Fun With Async ===>
Done with work!
Void method completed
Done with second task!
Completed
Done with third task!
Done with first task!
Вызов асинхронных методов из неасинхронных методов
В каждом из предшествующих примеров ключевое слово async использовалось для возвращения в поток вызывающего кода, пока выполняется асинхронный метод. В целом ключевое слово await может применяться только в методе, помеченном как async. А что если вы не можете (или не хотите) помечать метод с помощью async?
К счастью, существуют другие способы вызова асинхронных методов. Если вы просто не используете ключевое слово await, тогда код продолжает работу после асинхронного метода, не возвращая управление вызывающему коду. Если вам необходимо ожидать завершения асинхронного метода (что происходит, когда применяется ключевое слово await), то существуют два подхода.
Первый подход предусматривает просто использование свойства Result с методами, возвращающими Task<T>, или метода Wait() с методами, возвращающими Task/Task<T>. (Вспомните, что метод, который возвращает значение, обязан возвращать Task<T>, будучи асинхронным, а метод, не имеющий возвращаемого значения, возвращает Task, когда является асинхронным.) Если метод терпит неудачу, то возвращается AggregateException.
Можете также добавить вызов GetAwaiter().GetResult(), который обеспечивает такой же эффект, как ключевое слово await в асинхронном методе, и распространяет исключения в той же манере, что и async/await. Тем не менее, указанные методы помечены в документации как "не предназначенные для внешнего использования", а это значит, что они могут измениться либо вовсе исчезнуть в какой-то момент в будущем. Вызов GetAwaiter().GetResult() работает как с методами, возвращающими значение, так и с методами без возвращаемого значения.
На заметку! Решение использовать свойство Result или вызов GetAwaiter().GetResult() с Task<T> возлагается полностью на вас, и большинство разработчиков принимают решение, основываясь на обработке исключений. Если ваш метод возвращает Task, тогда вы должны применять вызов GetAwaiter().GetResult() или Wait().
Например, вот как вы могли бы вызывать метод DoWorkAsync():
Console.WriteLine(<b>DoWorkAsync().Result</b>);
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})Console.WriteLine(<b>DoWorkAsync().GetAwaiter().GetResult()</b>);
Чтобы остановить выполнение до тех пор, пока не произойдет возврат из метода с возвращаемым типом void, просто вызовите метод Wait() на объекте Task:
MethodReturningVoidAsync().Wait();
Ожидание с помощью await в блоках catch и finally
В версии C# 6 появилась возможность помещения вызовов await в блоки catch и finally. Для этого сам метод обязан быть async. Указанная возможность демонстрируется в следующем примере кода:
static async Task<string> MethodWithTryCatch()
{
try
{
//Do some work
return "Hello";
}
catch (Exception ex)
{
await LogTheErrors();
throw;
}
finally
{
await DoMagicCleanUp();
}
}
Обобщенные возвращаемые типы в асинхронных методах (нововведение в версии 7.0)
До выхода версии C# 7 возвращаемыми типами методов async были только Task, Task<T> и void. В версии C# 7 доступны дополнительные возвращаемые типы при условии, что они следуют шаблону с ключевым словом async. В качестве конкретного примера можно назвать тип ValueTask. Введите код, подобный показанному ниже:
static async ValueTask<int> ReturnAnInt()
{
await Task.Delay(1_000);
return 5;
}
К типу ValueTask применимы все те же самые правила, что и к типу Task, поскольку ValueTask — это просто объект Task для типов значений, заменяющий собой принудительное размещение объекта в куче.
Локальные функции (нововведение в версии 7.0)
Локальные функции были представлены в главе 4 и использовались в главе 8 с итераторами. Они также могут оказаться полезными для асинхронных методов. Чтобы продемонстрировать преимущество, сначала нужно взглянуть на проблему. Добавьте новый метод по имени MethodWithProblems() со следующим кодом:
Жалоба
Напишите нам, и мы в срочном порядке примем меры.