В большинстве случаев используйте его повсюду. Вот почему они превратили все, что занимает более 50 мс, в асинхронный вызов:).
Однако он будет иметь те же ловушки, что и любой асинхронный код. Отладка может стать сложнее. Если вы начинаете делать что-то одно, а затем он возвращается к длинной задаче в потоке пользовательского интерфейса, это может привести к ложному замораживанию (пользователь мог двигаться после щелчка, но потом не может, когда ничего не делает так, как он это видит). Etc
Если вы выполните его через код, ожидающий значений, он все равно будет работать как синхронный код. И если он попадет в кэш или произойдет какое-либо быстрое действие, он не будет работать асинхронно для эффективности. Таким образом, этот последний момент означает, что даже при наличии накладных расходов для выполнения магии компилятора в этих вызовах эта магия не будет выполнена, если вызов уже завершен и, следовательно, не стоит накладных расходов.
Итак, да, я бы сказал, используйте его почти везде :) Это отличный шаг для .NET
UPDATE
Если верить этой статье , то она только оправдывает то, что я говорю. Если вызов занимает менее 50 мс, он не является и не должен быть асинхронным из-за накладных расходов при его записи таким образом. И, фактически, чаще всего будет запускать синхронное действие вместо асинхронного. Однако, если оно превышает 50 мс, вы получаете только асинхронный вызов