Kotlin 科特林两次协同发射的区别
Kotlin 科特林两次协同发射的区别,kotlin,kotlin-coroutines,coroutinescope,Kotlin,Kotlin Coroutines,Coroutinescope,CoroutineScope(dispatchers.launch{}和CoroutineScope{launch{}}之间有什么区别 假设我有下面的代码: (您可以到Kotlin游乐场运行此代码段) 正如注释所述,当使用CoroutineScope().launch时,它不会调用打印,但是当使用另一种方式时,代码会按照预期的方式运行 有什么区别 谢谢 进一步问题 新发现 如果我离开执行类似这样的功能(不注释其中一个协同程序) 然后这两个协同程序都将被执行CoroutineScope().lau
CoroutineScope(dispatchers.launch{}
和CoroutineScope{launch{}}
之间有什么区别
假设我有下面的代码:
(您可以到Kotlin游乐场运行此代码段)
正如注释所述,当使用CoroutineScope().launch
时,它不会调用打印,但是当使用另一种方式时,代码会按照预期的方式运行
有什么区别
谢谢
进一步问题
新发现
如果我离开执行类似这样的功能(不注释其中一个协同程序)
然后这两个协同程序都将被执行CoroutineScope().launch{}
和CoroutineScope{launch{}
几乎没有任何共同之处。前者只是为要运行的launch
设置了一个临时作用域,并立即完成,而后者是一个可挂起的函数,它确保在返回之前在其中启动的所有协同程序都已完成
“进一步问题”下的代码段与原始代码段相同,只是删除了注释
第一个协同程序是否打印任何内容取决于非确定性行为:perform
在coroutineScope
中花费时间,等待内部启动
ed协同程序的完成,而第一个协同程序本身可能完成,也可能不完成。他们有同样的延迟。谢谢。现在我明白了区别。但是为什么前者不打印任何东西呢?如果它只为启动设置了一个作用域
,那么它应该运行函数来打印?因为您的整个程序在有机会打印之前就结束了。请阅读此问题和答案,进一步解释:
suspend fun perform(invokeAfterDelay: suspend () -> Unit) {
// not printing
CoroutineScope(Dispatchers.Default).launch {
delay(1000)
invokeAfterDelay()
}
// will print
coroutineScope {
launch {
delay(1000)
invokeAfterDelay()
}
}
}
fun printSomething() {
println("Counter")
}
fun main() {
runBlocking {
perform {
printSomething()
}
}
}
suspend fun perform(invokeAfterDelay: suspend () -> Unit) {
CoroutineScope(Dispatchers.Default).launch {
delay(1000)
invokeAfterDelay()
}
coroutineScope {
launch {
delay(1000)
invokeAfterDelay()
}
}
}