async/await - правильно ли это понимание?

После двух вопросов и большого замешательства - интересно, наконец-то я понял это правильно. Это мое понимание

async/await служит только одной цели - разрешить выполнение кода после завершения уже асинхронной задачи. например

async Task CallerMethod()
{
     await AsyncMethod();
     AnotherMethod();
}

позволяет AnotherMethod выполняться после асинхронного AsyncMethod закончено вместо сразу после AsyncMethod запущен

async / await НИКОГДА не делает ничего асинхронного. Он не запускает отдельный поток (если, конечно, ожидаемый метод не делает это в любом случае) и т. Д.

Правильно ли мое понимание (наконец)?

2 ответа

Решение

Хотя ответ Стивена правильный, я хочу убедиться, что у вас есть несколько дополнительных ясных моментов.

async / await НИКОГДА не делает ничего асинхронного

Это делает CallerMethod асинхронный метод. CallerMethod возвращает Task что само по себе можно ожидать, и CallerMethod возвращает эту задачу до работы CallerMethod сама по себе завершена, поэтому это асинхронный метод.

Это не делает AsyncMethod асинхронный; это было уже асинхронно.

Это не запускает отдельный поток

Правильно. Это частый источник путаницы. Потоки - это единица параллелизма, которая является лишь одним из видов асинхронности. Обычно помогает аналогия. Вы можете положить хлеб в тостер, подождать, пока он поджарится, а затем сделать яйца. Вы можете положить хлеб в тостер, готовить яйца во время тоста, а затем разбираться с тостом после того, как яйца будут готовы. Или вы можете нанять двух поваров, один для приготовления яиц и один для тостов. Первый - синхронная обработка. Второй и третий асинхронные, но только третий является одновременным. Обратите внимание, что третье решение является самым дорогим; Нитки рабочие, а рабочие не дешевые.

То, что делает асинхронный метод асинхронным, это не то, что он является параллельным - хотя это может быть. Что делает его асинхронным, так это то, что он предоставляет вам механизм, который позволяет вам делать что-то еще, пока вы ожидаете завершения его работы. await Это просто приятный способ написать "вот код, который я хочу, чтобы вы запустили после успешного завершения задачи".

async/await НИКОГДА не делает ничего асинхронного. Он не запускает отдельный поток (если, конечно, ожидаемый метод не делает это в любом случае) и т. Д.

Да.

Перефразируй, async/await позволяет писать код с асинхронной точки зрения. То есть код может "асинхронно ждать" (await) завершить операции и, в свою очередь, определить свою собственную асинхронную операцию (задача, возвращаемая из async метод, который представляет выполнение этого метода).

Другие вопросы по тегам