Извините, если это глупый вопрос
Это не глупый вопрос.Это важный вопрос.
У меня есть сотрудник, который утверждает, что это делает вызов A синхронным, и он продолжает придумывать журналы Console.WriteLine, которые, по-видимому, подтверждают его точку зрения.
Это фундаментальная проблема, и вам нужно обучить своих коллег, чтобы они перестали вводить в заблуждение себя и других. Асинхронного вызова не существует. вызов не является асинхронным, когда-либо .Скажи это со мной. Вызовы не являются асинхронными в C # .В C # при вызове функции эта функция вызывается сразу после вычисления всех аргументов .
Если ваш коллега или вы считаете, что существует такая вещь, как асинхронный вызов, вас ждет мир боли, потому что ваши убеждения о том, как работает асинхронность, будут очень оторваны от реальности.
Итак, ваш коллега прав?Конечно они есть. Вызов A
является синхронным, поскольку все вызовы функций являются синхронными .Но тот факт, что они считают, что существует такая вещь, как «асинхронный вызов», означает, что они сильно ошибаются в отношении того, как асинхронность работает в C #.
Если конкретно ваш коллега считает, что await M()
как-то делает вызовна M()
"асинхронный", то у вашего коллеги есть большое недоразумение.await
является оператором .Конечно, это сложный оператор, но это оператор, который работает со значениями.await M()
и var t = M(); await t;
- это одно и то же .Ожидание происходит после вызова, поскольку await
работает с возвращаемым значением .await
- это НЕ инструкция для компилятора "генерировать асинхронный вызов M ()" или любой другой такой вещи;не существует такого понятия, как «асинхронный вызов».
Если это характер их ложного убеждения, то у вас есть возможность обучить коллегу тому, что означает await
.await
означает что-то простое, но мощное.Это означает:
- Посмотрите на
Task
, над которым я работаю. - Если задача выполнена исключительно, выведите это исключение
- Если задача выполнена нормально, извлеките это значение и используйте его
- Если задача не завершена, зарегистрируйтеостаток этого метода в качестве продолжения ожидаемой задачи и возврата new
Task
, представляющего неполный асинхронный рабочий процесс этого вызова, в my caller .
Это все, что await
делает.Он просто проверяет содержимое задачи, и, если задача не завершена, он говорит: «Ну, мы не можем добиться какого-либо прогресса в этом рабочем процессе, пока эта задача не будет завершена, поэтому вернитесь к моей вызывающей стороне, которая найдет что-то еще для этого процессораделать ".
природа кода внутри А не меняется только потому, что мы его не ждем.
Это правильно.Мы синхронно вызываем A
, и он возвращает Task
.Код после вызова сайта не работает, пока не вернется A
.Интересная вещь в A
заключается в том, что A
разрешено возвращать неполный Task
вызывающей стороне , и эта задача представляет узел в асинхронном рабочем процессе .Рабочий процесс уже асинхронный, и, как вы заметили, для A
не имеет значения, что вы делаете с его возвращаемым значением после , которое он возвращает;A
понятия не имеет, собираетесь ли вы await
вернуть Task
или нет.A
просто выполняется так долго, как может, и затем либо возвращает завершенную обычно задачу, либо завершенную исключительно задачу, либо возвращает незавершенную задачу.Но ничто из того, что вы делаете на сайте вызовов, не меняет этого.
Поскольку возвращаемое значение из A не требуется, нет необходимости ждать задачи на сайте вызовов
Правильно.
Нет необходимости ждать задачи на месте вызова, пока кто-то в цепочке ожидает ее (что происходит в C).
Теперь вы потеряли меня.Почему у кого-то есть , чтобы ждать Task
, возвращенного A
? Скажите, почему вы считаете, что кому-то требуется - await
, что Task
, потому что у вас может быть ложное убеждение.
Мой коллега оченьнастойчиво и я начал сомневаться в себе.Мое понимание неверно?
Ваш коллега почти наверняка не прав.Ваш анализ кажется правильным вплоть до того момента, когда вы говорите, что существует требование , чтобы каждый Task
был await
ed, что не соответствует действительности.Это странно , а не await
a Task
, потому что это означает, что вы написали программу, в которой вы начали операцию, и не заботитесь о том, когда и как она завершается, и она, безусловно, пахнет плохо для написания подобной программы, но нет требования к await
каждые Task
.Если вы верите, что есть, снова скажите, что это за убеждение, и мы разберемся с ним.