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
метод, который представляет выполнение этого метода).