Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 科特林两次协同发射的区别_Kotlin_Kotlin Coroutines_Coroutinescope - Fatal编程技术网

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()
            }
        }

    }