Предположим, вы разрабатываете api и хотите предложить асинхронные методы, но есть вероятность, что пользователь фактически не хочет «ждать» для того, чтобы какой-либо конкретный метод асинхронизации завершился, прежде чем перейти к следующей строке; есть ли способ сделать его «огнем и забыть»? То есть сделайте так, чтобы метод фактически выполнялся асинхронно через Задачу и продолжал ли она следующую строку без ожидания? Таким образом, если пользователь хочет его ждать, то они могут, а те, которые хотят просто запустить его как задачу, могут это сделать.Объявление асинхронного метода, который может быть как ожидаемым *, так и * запускать асинхронно, не дожидаясь его завершения?
ответ
(Moving мой комментарий к ответу, потому что я предполагаю, что это такое)
Все методы работают асинхронные, что выход из коробки. Пользователь никогда не должен ждать чего-либо. Это зависит от пользователя, который ждет ваш метод async или нет. Вам не нужно делать ничего особенного для поддержки обоих случаев.
Пример:
public async Task MyAsyncMethod() {
// do something asynchronous in here...
}
Вы можете вызвать метод с await
:
await obj.MyAsyncMethod();
... или нет ...
obj.MyAsyncMethod();
В этом последнем случае, метод будет огнем и забыть.
Пользователь также может выбрать сделать следующее с вашим методом:
Task t = obj.MyAsyncMethod();
// perform some other tasks that don't depend on the completion of "MyAsyncMethod"
await t; // now I want to await on the task before continuing.
// perform more tasks that require the completion of "MyAsyncMethod"
И как вы можете видеть, мне не нужно делать какие-либо изменения в мой метод асинхронной поддерживать все 3 случая.
+1 но я бы не рекомендовал делать код 'void'. Методы 'void'' async' были * специально созданы для одного, узкого, использования - обработчиков событий. Если вы найдете их где-нибудь еще, это, как правило, ошибка. См. [Избегайте асинхронных методов] (http://stackoverflow.com/help/formatting) и связанной с ним статьи, связанной с ней –
@Damien: Вы правы, вероятно, лучше не упоминать эту опцию в этом контексте. Благодарю. Редактирование этого. – sstan
Это правда, что вы не заставили себя ждать; однако, я понимаю, что если вы этого не ожидаете, то все, что вы называете асинхронным методом, будет выполняться синхронно до следующего ожидания. – Anthony
Вы должны понимать, что await
не выполняет метод. await
только регистрирует продолжение оставшейся функции в объекте Task
, который возвращается функцией. (фактически в Awaiter объекта Task
).
Таким образом, функция выполняет, независимо от того, как и как вы дождались ее завершения. Вы можете сохранить объект Task
и await
позже. Или вы ждете его блокировки с помощью функции Task.Wait
.
Понял; однако, я понимаю, что если вы этого не ожидаете, то все, что вы называете асинхронным методом, будет выполняться синхронно до следующего ожидания. – Anthony
Это не совсем правильно. То, что находится в методе, выполняется синхронно в любом случае до первого 'ожидания 'внутри метода. Первый «ожидание» метода приведет к тому, что функция вернет объект «Задача». – Nitram
Правильно, он будет работать синхронно независимо, но мне было интересно, есть ли альтернатива, где мы могли бы «упаковать» всю задачу async в качестве реальной задачи, которая может выполняться асинхронно полностью. – Anthony
- 1. Запускать скрипт каждые x секунд, не дожидаясь его завершения.
- 2. Задача не дожидаясь завершения
- 3. p.waitFor(), не дожидаясь его завершения (Java)
- 4. jQuery.when не дожидаясь завершения
- 5. Task.WaitAll не дожидаясь завершения задачи
- 6. Почему главное не дожидается завершения асинхронного метода?
- 7. Возврат из Контроллера, не дожидаясь завершения метода асинхронизации
- 8. может быть загружен асинхронно?
- 9. Не может быть ожидаемым JSON от urllib2
- 10. Как запустить задачу внутри метеорного метода, не дожидаясь завершения?
- 11. Дождитесь завершения асинхронного запроса
- 12. Mocha проверяет случаи, не дожидаясь до завершения
- 13. Функция работает, не дожидаясь завершения предыдущего.
- 14. Как запустить другой скрипт в Python, не дожидаясь его завершения?
- 15. Как отправить почту, не дожидаясь завершения операции
- 16. Закончить деятельность, не дожидаясь завершения
- 17. Продолжить Не дожидаясь завершения задачи
- 18. Выполнение процесса бэкэнда электронной почты, не дожидаясь его завершения
- 19. Parallel.Invoke(), не дожидаясь завершения выполнения
- 20. Асинхронно запускать хранимую процедуру
- 21. Asynchronous Storec Proc не дожидаясь завершения
- 22. Выполните другой файл PHP, не дожидаясь его завершения.
- 23. Вызов веб-службы асинхронно, не дожидаясь ответа
- 24. Выполнение тестов после завершения асинхронного метода setUp
- 25. Дождитесь завершения асинхронного метода WCF перед продолжением
- 26. jQuery, когда это сделано, не дожидаясь его завершения
- 27. Попытка асинхронного метода не удается
- 28. Как запускать задачи таймера асинхронно?
- 29. Как подождать завершения асинхронного отправления?
- 30. Объявление метода, который принимает блок
Все они работают таким образом из коробки. Пользователь никогда не должен ждать чего-либо. И если вы хотите, чтобы он был огнем и забыл, сделайте возвращаемый тип 'void'. Но если вы вернете «Задачу», пользователю нужно ждать ее или нет. Вам не нужно делать ничего особенного для поддержки обоих случаев. – sstan