Комментарии 7
Это пример из оригинальной статьи, Стивен в данном случае показывает, как из синхронного кода сделать асинхронный и что в данном случае генерируется компиллятором. В статье идут отсылки к предыдущим частям, поэтому я рекомендую начинать читать с первой части.
автор. а можете разъяснить какой вобще смысл в примере в начале стать - взять асинхронную ф-ию и ждать ее выполнения (фактически сделать ее синхронной ) внутри опять асиннхрнной ф-ии?
У любой функции есть результат выполнения. Даже если это void — функция всё ещё может свалиться с исключением, и наличие либо отсутствие оного тоже входит в понятие результата.
Если результат есть — кому-то он нужен. Это неверно для некоторых инфраструктурных функций, но для бизнес-логики это аксиома.
Если нам нужен результат асинхронной функции — нам нужен способ его дождаться и достать. Желательно, без пустого занимания потока, т.е. асинхронно. Для этого и придумали оператор await.
Где именно в этой цепочке вы видите отсутствие смысла?
Await означает: "Позови, когда выполнится эта штука и я обработаю результат тем кодом, который идёт после этого вызова". Фактически, на этом месте нить перестанет выполнять код этой функции и займётся чем-то другим.
Мы сделали ее синхронной, если бы заставили нить ждать результат: либо став неактивной, либо постоянно переспрашивая "все уже готово? Все уже готово?" В
в цикле как осел в Шреке.
Грубо говоря, можно считать, что остаток функции после await - это колбек, который вызовут по готовности результата
«Task is known specially to C#» (у вас — «Task существует специально для C#») я бы перевел по смыслу: «конкретно известен компилятору C#». Если же переводить буквально то это будет «специально известен для C#» — в любом случае никакого «существует» там нет.
Как на самом деле работает Async/Await в C# (Часть 6)