Ваш первоначальный пример:
async Task DoSomething()
{
await service.doSomething();
}
Есть немного более неэффективна версия, чем ваша первой альтернатива:
Task DoSomething()
{
return service.doSomething();
}
Это дороже, потому что он должен создать всю государственную машину, связанную с асинхронным кодом, тогда как версия, показанная выше, не требует этого. Если вы должны использовать дизассемблер, такой как IlSpy, и проверить генерируемые компилятором символы, вы увидите, что создается специальный класс для вашей версии async
(DoSomething<d__0>
или некоторые такие), которые не будут созданы, если вы не использовали async.
С другой стороны, следует избегать, по возможности, вашего второго примера - с использованием .Wait()
. Это иллюстрирует две проблем:
- Использование
.Wait
означает, что вы выбираете отказ от async
, которая побеждает все точки. («Асинхронный» код теперь вызывается в вызывающем потоке и блоках)
- Использование
.Wait
также часто приводит к взаимоблокировкам потоков, которые лучше всего разрешать, позволяя использовать семантику await
для распространения через ваш код.
http://stackoverflow.com/questions/9519414/whats-the-difference-between-task-start-wait-and-async-await –
On * which * сценарий? – dcastro