await
против возврата Task
Разница между:
await ActionAsync(context, async x => await IsOddAsync(x).ConfigureAwait(false));
await ActionAsync(context, x => IsOddAsync(x));
В некоторых случаях вам не нужно await
(а также не async
конечно)
Методы, выполняющие асинхронные операции, не должны использовать await, если:
- В методе есть только один асинхронный вызов
- Асинхронный вызов находится в конце метода
- Исключение отлова / обработки, которое может произойти в Задаче, необязательно
См. Возврат Задачи без ожидания.
В этом случае вы можете вернуть Task
промежуточно.
Обратите внимание, что существует небольшое различие в поведении - в зависимости от реализации IsOddAsync
:
Внимание! Возвращение задачи вместо ее ожидания изменяет поведение метода для исключения, поскольку оно не вызывает исключение внутри метода, который запускает задачу, но в методе, который ее ожидает.
Как отметил Габриэль Люси, в текущей реализации IsOddAsync
(один вызов и await
) нет различий в поведении.
x => IsOddAsync(x)
против IsOddAsync
Разница между
await ActionAsync(context, x => IsOddAsync(x));
await ActionAsync(context, IsOddAsync);
В первом из них вы создаете анонимный (лямбда) метод с параметром x
,Поскольку IsOddAsync
имеет также один параметр (с тем же типом), нет необходимости в лямбда-методе.
Обратите внимание, что вам нужна лямбда, если IsOddAsync
имеет другие параметры, например, и 2-й параметр, тогдатебе нужна лямбдаПример:
await ActionAsync(context, x => IsOddAsync(x, "mySecondParameter"));
В этом случае нет различий в поведении, кроме стека вызовов при возникновении исключения внутри.