Почему в руководящих принципах говорится "избегайте асинхронной пустоты", а не "не избегайте ожидания задания"
Почему в руководящих принципах говорится: async
void
"Я не знаю, но я чувствую, что руководство должно скорее сказать -"await
task
". Проблема с async void
является то, что вызывающий абонент не будет знать, если это необходимо await
для завершения и контроля будет продолжено выполнение следующих заявлений. Я могу понять вредный эффект этого. Но даже если async
метод возвращает task
вместо void
Звонящий может все же пропустить, чтобы ждать и попасть в те же проблемы, верно? Отсюда возникает вопрос: почему бы не указывать, а сказать, что не стоит ждать задачи?
2 ответа
Вы можете сделать это, то есть вы можете сделать недействительным или не ждать task
завершить на всех.
Но не может быть сценарий, когда вы разработали API
который используется несколькими projects
и некоторые из проектов, использующих ваш метод, хотят дождаться завершения вызова, хотя метод не будет ничего возвращать только для проверки или для выполнения работы после завершения метода.
В этом сенарио это полезно, и именно поэтому вы должны вернуться Task
не void
, Это помогает другим, которые используют ваш метод.
Это одна из логических причин, помимо той, что вы задали.
Вы не всегда хотите предотвратить выполнение остальной части метода до завершения этой операции. Иногда у вас есть кое-что, что вы можете сделать до его завершения, поэтому вы хотите дождаться его позже, возможно, одному звонящему просто не нужны результаты, поэтому он может игнорировать его безопасно и т. Д. Дело в том, что метод возвращает Task
звонящий должен сделать с ним то, что он будет делать. Если они хотят что-то сделать по завершении этой задачи или знают, успешно ли она выполнена или нет, они могут, а если нет, то это нормально.
Когда метод является async void
метод, который взят из ваших рук. Вызывающий абонент находится в положении, когда он не может знать, когда операция закончилась, даже если он действительно должен знать. И это просто не решение, которое следует принимать при написании метода. Этот метод не будет знать, кто все будет его вызывать, и нужно ли им знать, когда / когда он закончил, поэтому при написании метода вам нужно предположить, что кто-то захочет получить эту информацию.
Все это говорит о том, что запуск асинхронного метода и его полное игнорирование должны быть очень редкими. Есть ситуации, когда это уместно, но это должен быть большой красный флаг в любое время, когда вы его видите. Однако, когда это происходит, вызывающий метод должен принимать решение, о котором им наплевать, когда эта операция завершается, а не автор метода, решающий, что никто не должен знать, когда она завершается (снова вне некоторых действительно исключительных ситуаций).