Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
await Task.WhenAny(task1, task2, task3);В результате вывод становится таким:
Fun With Async ===>Done with work!Void method completedDone with second task!CompletedDone with third task!Done with first task!Вызов асинхронных методов из неасинхронных методов
В каждом из предшествующих примеров ключевое слово
asyncawaitasyncasyncК счастью, существуют другие способы вызова асинхронных методов. Если вы просто не используете ключевое слово
awaitawaitПервый подход предусматривает просто использование свойства
ResultTask<T>Wait()Task/Task<T>Task<T>TaskAggregateExceptionМожете также добавить вызов
GetAwaiter().GetResult()awaitasync/awaitGetAwaiter().GetResult()На заметку! Решение использовать свойство
ResultGetAwaiter().GetResult()Task<T>TaskGetAwaiter().GetResult()Wait()Например, вот как вы могли бы вызывать метод
DoWorkAsync()Console.WriteLine(<b>DoWorkAsync().Result</b>);Console.WriteLine(<b>DoWorkAsync().GetAwaiter().GetResult()</b>);Чтобы остановить выполнение до тех пор, пока не произойдет возврат из метода с возвращаемым типом
voidWait()TaskMethodReturningVoidAsync().Wait();Ожидание с помощью await в блоках catch и finally
В версии C# 6 появилась возможность помещения вызовов await в блоки
catchfinallyasyncstatic async Task<string> MethodWithTryCatch(){ try { //Do some work return "Hello"; } catch (Exception ex) { await LogTheErrors(); throw; } finally { await DoMagicCleanUp(); }}Обобщенные возвращаемые типы в асинхронных методах (нововведение в версии 7.0)
До выхода версии C# 7 возвращаемыми типами методов
asyncTaskTask<T>voidasyncValueTaskstatic async ValueTask<int> ReturnAnInt(){ await Task.Delay(1_000); return 5;}К типу
ValueTaskTaskValueTaskTaskЛокальные функции (нововведение в версии 7.0)
Локальные функции были представлены в главе 4 и использовались в главе 8 с итераторами. Они также могут оказаться полезными для асинхронных методов. Чтобы продемонстрировать преимущество, сначала нужно взглянуть на проблему. Добавьте новый метод по имени
MethodWithProblems()