CoroutineScope(SupervisorJob())
val scope2 = CoroutineScope(SupervisorJob()) //Different Dispatcher
suspend fun criticalSectionSuspending(): String {
println("Starting!")
val scope3 = CoroutineScope( coroutineContext)
val someJob = scope3.launch {
delay(200)
println("Delay!")
}
return "Result"
}
fun main() {
scope.launch {
val res = scope2.async{criticalSectionSuspending()}.await()
println(res)
}
Thread.sleep(500)
}
возвращает
Starting!
Delay!
Result
Вот я не пойму, чего так? почему ждет до завершения блока в scope3 прежде чем вернуть значение функции?
вообще не понимаю в чем практический смысл этих примеров, они крайне контринтуитивны. если хочется эксперементировать с корутинами, советую сначала ознакомится с базовыми концепциями и почитать статьи Романа Елизарова в частности (structural concurrency) а так ответ на твой вопрос примерно такой: когда создаешь scope3 и передаешь текущий context ты таким образом привязываешь скоуп3 к тому где вызывается criticalSection.... т.е. к скоупу, который создается в async. т.е. тот await будет длится чуть больше 200 милисекунд. когда создаешь скоуп как CoroutineScope() -- то он становится глобальным. и поэтому await() не будет задерживаться на 200 миллисекунд
Обсуждают сегодня