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 并且由于 launchCoroutineScope 上的扩展函数,因此它是有效的。

名字其实有点乱。 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 的好处是当父协程取消时,内部启动的协程将被取消。