val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
fun main() = runBlocking {
val channel = BroadcastChannel<String>(1)
for (i in 0..20) {
println("iteration ${i + 1} start")
val job = scope.launch {
channel.openSubscription()
.receiveAsFlow()
.collect { println("receive $it") }
}
scope.launch(Dispatchers.IO) {
channel.send("$i")
}
delay(200)
job.cancel()
}
return@runBlocking
}
Но вот println("receive $it") печатает только первые два значения, и я не могу понять, в чем причина. Может кто-то сможет объяснить
Ну для начала у вас замешаны два скоупа - один от runBlocking, второй от scope. Надо все-таки использовать или то, или другое или наследовать одно от другого. Дальше, не понятна логика, по которой вы все отменяете. Вполне может быть, что на разогреве виртуальной машины, вы и не успеваете отослать больше двух значений. Зачем там вообще отмена по времени?
Обсуждают сегодня