Язык программирования 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>);
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
async
ValueTask
static async ValueTask<int> ReturnAnInt()
{
await Task.Delay(1_000);
return 5;
}
К типу
ValueTask
Task
ValueTask
Task
Локальные функции (нововведение в версии 7.0)
Локальные функции были представлены в главе 4 и использовались в главе 8 с итераторами. Они также могут оказаться полезными для асинхронных методов. Чтобы продемонстрировать преимущество, сначала нужно взглянуть на проблему. Добавьте новый метод по имени
MethodWithProblems()