withContext
создает новую работу.Это означает, что все сопрограммы, запущенные внутри, являются детьми этой работы.Возвращается только когда работа закончена.Из-за структурированного параллелизма он завершается только тогда, когда завершены также все дочерние сопрограммы.
При сбое любого из дочерних заданий родительское задание отменяется.Это также отменит все другие детские задания.Поскольку withContext
возвращает результат, генерируется исключение.
Документация из CoroutineScope
полезна в этом отношении:
Каждый строитель сопрограмм (например, launch, async и т. д.), и каждая функция определения объема (например, coroutineScope, withContext и т. д.) предоставляет собственную область видимости со своим собственным экземпляром Job во внутренний блок кода, который она выполняет.По соглашению, они все ждут завершения всех сопрограмм внутри своего блока, прежде чем завершить себя, тем самым обеспечивая дисциплину структурированного параллелизма.
Я думаю, что документация withContext
также может быть улучшена.Документация Job
и CoroutineContext
очень полезна, поскольку она обеспечивает более высокую точку зрения.
Кроме того, означает ли это, что мы можем использовать coroutineScope и withContext (coroutineContext) взаимозаменяемоРазница лишь в том, что шаблон немного меньше?
Да, они должны вести себя одинаково.Они предназначены для разных случаев использования.
coroutineScope
предназначено для предоставления области действия для нескольких параллельных сопрограмм, в которых все будут отменены, если произойдет сбой.
withContext
предназначен для использования для переключения контекста (например,Диспетчер) для данного блока кода.
Здесь - аналогичный вопрос, который я недавно задавал на форумах kotlin.В ветке есть еще несколько подобных случаев и дальнейшее понимание.