В последней статье мы познакомим вас с асинхронным процессом, рассказав историю приготовления завтрака. В этой статье я реализую его с помощью C#. Кроме того, мы подробно рассмотрим, как на самом деле работает синтаксис async/await в C#.

Прежде чем читать эту статью, убедитесь, что вы прочитали мою предыдущую статью.



Пример кода приготовления завтрака

Ниже представлен синхронный процесс приготовления завтрака…

Интуитивно получить результат за 8 минут.

Давайте сделаем асинхронную версию.

Как видите, нам нужно всего 5 минут, чтобы закончить наш завтрак. Кстати, внимательно посмотрите, когда задание начинается и заканчивается.

Код Пояснение

Как вы видели, в нашем асинхронном коде много «ожиданий». Как мы можем интерпретировать это простым способом?

По моему опыту, ожидание означает для меня две вещи при чтении кода…

Во-первых, когда вашей программе требуется задача, связанная с вводом-выводом, например вызов API или загрузка файлов, в этом случае «ожидание» означает, что она не будет блокировать поток и ждать результата. Вместо этого он отскочит назад и увидит, есть ли еще какая-то работа.

Во-вторых, «ожидание» также означает, что функция гарантирует возврат результата или завершение задания до того, как мы продолжим выполнение кода, приведенного ниже синтаксиса ожидания.

И не беспокойтесь об «асинхронности», это просто знак, сообщающий компилятору, что у нас есть синтаксис ожидания внутри нашей функции, и тип возвращаемого значения будет Task.

Итак, как мы можем прочитать асинхронный код, двигая пальцем?

Вначале просто перемещайте палец в Main() сверху вниз, пока не дойдете до makeCoffeeTask = MakeCoffeeAsync(). Переместите палец к верхней части функции MakeCoffeeAsync и начните двигаться вниз, пока не дойдете до «ожидания». Согласно моему первому опыту, мы вернемся назад и увидим другую работу, поэтому мы выполним fryEgg() и fryBacon(). Эти две функции не являются асинхронными, поэтому они будут удерживать наш ресурс до тех пор, пока он не завершится. Продолжаем перемещать палец к toastBreadTask= toastBreadAsync(). Как и в случае с задачей кофе, мы перемещаем палец в верхнюю часть функции toastBreadAsync() и начинаем спускаться вниз, пока не достигнем «ожидания», как я уже говорил ранее, мы вернемся к Main(). Мы продолжаем двигаться к «ожиданию makeCoffeeTask». Если мы применим мой первый опыт, это будет странно, верно? Нечего прыгать, пока не получим результат кофе. Эту ситуацию лучше рассматривать как второй опыт. Это гарантированно вернет вам результат. Но он не будет блокировать поток в ожидании результата. То же объяснение в «await toastBreadTask». Излишне говорить, что вы уже знаете, что произойдет, когда мы перейдем к Combine().

Заключение

В C# асинхронная функция должна выполняться как задача. Он будет выполняться, пока задача установлена. Программист решает, когда нам нужен результат этой асинхронной функции. Самое главное, что мы должны знать, когда я должен получить результат задачи, чтобы продолжить выполнение моего кода, иначе ваш код будет работать как синхронная функция. Продолжайте учиться и продолжайте пробовать. Вы познакомитесь с этим синтаксисом.