Как следует отменить детей в Коутинах Котлин?

В соответствии с документами cancelChildren должен отменить дочерние ролики coroutine, но оставить родителя незатронутым («состояние этой работы не затрагивается».) Однако, если у меня есть код вроде

val outer = launch { try { launch (coroutineContext) { try { // work here } catch (ex: Exception) { println("In inner catch") } finally { println("In inner finally") } } delay(5000) // so the outer job is running when I cancel it } catch (ex: CancellationException) { println("In outer catch") } finally { println("In outer finally") } } delay(100) // give it a chance to run outer.cancelChildren() 

Затем я вижу следующее

 In inner catch In inner finally In outer catch In outer finally 

Почему отменяется «внешняя» работа?

Это то же самое поведение, которое я получаю, если я вызову external.cancel (но я ожидаю)

Ваша delay(5000) во внешней сопрограмме outer.cancelChildren() и, таким образом, влияет на outer.cancelChildren() . Он выдает CancellationException во внешней try . Функция cancelChildren не отменяет внешнее задание, что можно сделать очевидным, проверяя outer.isCancelled после вызова.

Если вызов delay удаляется из кода, он печатает ожидаемый результат. Обратите внимание, что сопрограммы ждут своих детей в любом случае , отсрочка не требуется:

Родительская сопрограмма всегда ждет завершения всех своих детей. Родитель не должен явно отслеживать все дети, которые он запускает, и ему не нужно использовать Job.join, чтобы дождаться их в конце.

Intereting Posts
Какую ниже технологию я должен узнать теперь, когда разработчик Android будет использовать лучшие возможности в ближайшие дни? Можно ли включить переменную в тело условия while для Kotlin? Способы запутывания доступа к привилегированным частным, но на самом деле публичным членам класса для использования их в встроенных методах Инструментальные тесты не могут выполняться в библиотечных модулях Android с файлами Kotlin Kotlin – Характер подачи формы – Незаконный побег: '\ f' Проблема с привязкой данных с помощью Kotlin для Android Расширьте Mockito, чтобы убедиться, что Kotlin не работает (в режиме «kotlin») перегрузка + и + = операторов для «классов номеров» Kotlin: unit test assert object после gson Как отсортировать поле MutableMap по объекту с сохранением другого поля объекта в качестве индекса? Не удалось загрузить файл на Android, и нет никаких сведений об ошибке Могу ли я обновить глубоко вложенный неизменный объект, не сообщая ему о его контексте? Запуск тестов Kotlin Koans от Android Studio Основной метод Kotlin Android не вызывается Android Kotlin Защищенное свойство предоставляет свой закрытый тип ExpiresLayout