CoroutineScope 启动在直接调用中运行良好,但在参数范围内启动,不起作用
CoroutineScope launch work well inside direct call, but inside parameter scope launch, not working
fun test(coroutineScope: CoroutineScope){
coroutineScope.launch {
//FUNC 1
}
CoroutineScope(Dispatchers.XXX).launch {
//FUNC 2
}
}
FUNC 1 不工作,但 FUNC 2 工作正常!
我不知道两者的区别
这是因为 coroutineScope
是一个函数,它 returns 无论 lambda 块如何 returns。由于它是一个函数,因此您需要像 coroutineScope(block = { ... })
或 coroutineScope { ... }
那样调用它。在您的第二种情况下,CoroutineScope(Dispatchers.XXX)
returns a CoroutineScope
并且由于 launch
是 CoroutineScope
上的扩展函数,因此它是有效的。
名字其实有点乱。 coroutineScope
是一个以 CoroutineScope
为接收者的暂停 lambda 函数,而 CoroutineScope(context)
是一个创建 CoroutineScope 的函数。
coroutineScope
通常用于捕获挂起函数中的当前 coroutineContext
。例如,
suspend fun uploadTwoFiles() {
// Here we need to launch two coroutines in parallel,
// but since "launch" is an extension function on CoroutineScope,
// we need to get that CoroutineScope from somewhere.
coroutineScope {
// Here we have a CoroutineScope so we can call "launch"
launch { uploadFile1() }
launch { uploadFile2() }
}
// Also, note that coroutineScope finishes only when all the children coroutines have finished.
}
使用 coroutineScope
的好处是当父协程取消时,内部启动的协程将被取消。
fun test(coroutineScope: CoroutineScope){
coroutineScope.launch {
//FUNC 1
}
CoroutineScope(Dispatchers.XXX).launch {
//FUNC 2
}
}
FUNC 1 不工作,但 FUNC 2 工作正常!
我不知道两者的区别
这是因为 coroutineScope
是一个函数,它 returns 无论 lambda 块如何 returns。由于它是一个函数,因此您需要像 coroutineScope(block = { ... })
或 coroutineScope { ... }
那样调用它。在您的第二种情况下,CoroutineScope(Dispatchers.XXX)
returns a CoroutineScope
并且由于 launch
是 CoroutineScope
上的扩展函数,因此它是有效的。
名字其实有点乱。 coroutineScope
是一个以 CoroutineScope
为接收者的暂停 lambda 函数,而 CoroutineScope(context)
是一个创建 CoroutineScope 的函数。
coroutineScope
通常用于捕获挂起函数中的当前 coroutineContext
。例如,
suspend fun uploadTwoFiles() {
// Here we need to launch two coroutines in parallel,
// but since "launch" is an extension function on CoroutineScope,
// we need to get that CoroutineScope from somewhere.
coroutineScope {
// Here we have a CoroutineScope so we can call "launch"
launch { uploadFile1() }
launch { uploadFile2() }
}
// Also, note that coroutineScope finishes only when all the children coroutines have finished.
}
使用 coroutineScope
的好处是当父协程取消时,内部启动的协程将被取消。