2017-12-20 33 views
1

("자체는 영향을받지 않습니다이 작업의 상태를.") 내가 가지고 그러나 경우cancelChildren은 Kotlin Coroutines에서 어떻게 작동해야합니까? 코 루틴의 아이들을 취소하지만 영향을받지 부모 떠나야한다 문서의 cancelChildren에 따르면

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 

'외부'작업이 취소되는 이유는 무엇입니까?

outer.cancelChildren()에 의해 영향을 받는다 따라서 외부 코 루틴에 내가 outer.cancel 호출하면 내가 할 (하지만 기대) 동일한 행동

답변

0

귀하의 delay(5000)입니다 취소 할합니다. 바깥 쪽 try에서 보이는 CancellationException을 던졌습니다. cancelChildren 함수는 외부 작업을 취소하지 않으며 호출 후 outer.isCancelled을 확인하여 분명히 알 수 있습니다.

코드에서 delay 호출을 제거하면 예상 결과가 인쇄됩니다. 코 루틴은 아이들을 기다린다. anyway, 지연은 불필요하다 :

부모 코 루틴은 항상 모든 자식의 완료를 기다린다. 부모는 실행되는 모든 자식을 명시 적으로 추적 할 필요가 없으며 결국에는 Job.join을 사용할 필요가 없습니다.

+0

감사합니다. 일시 중단 함수 (지연, 조인 ...)는 내가 알지 못했던 CancellationException을 전파합니다. 이것은 '부모'가 '어린이'가 취소되었음을 알고 있어야하므로 의미가 있습니다. –

+0

예, 정확하게는 :-) – s1m0nw1