据我所知,suspend函数转换为具有附加Continuation参数的函数,并且当block从suspendCoroutineUninterceptedOrReturn返回COROUTINE_SUSPENDED值时,suspend fun挂起。但是Kotlin协程内部如何决定函数应该被挂起还是结果可以立即返回呢?
block
suspendCoroutineUninterceptedOrReturn
COROUTINE_SUSPENDED
suspend fun
6mzjoqzu1#
将其标记为suspend使函数能够挂起,但只有当函数本身调用另一个实际挂起的函数时,它才会挂起。(仅在更改当前调度程序时挂起)、Job.join()、Deferred.await()、SendChannel.send()、ReceiveChannel.receive()、Flow.collect()、suspendCoroutine、和suspendCancellableCoroutine。其中一些仅在特定条件下挂起如果您查看上述函数的源代码,就会发现它们的级别非常低,直接与Continuation发生冲突,或者具有固有行为。我可能错过了一些基本级别的挂起函数,但它通常归结为它们中的一个是否在调用堆栈中并遇到挂起的条件。
suspend
Job.join()
Deferred.await()
SendChannel.send()
ReceiveChannel.receive()
Flow.collect()
suspendCoroutine
suspendCancellableCoroutine
1条答案
按热度按时间6mzjoqzu1#
将其标记为
suspend
使函数能够挂起,但只有当函数本身调用另一个实际挂起的函数时,它才会挂起。(仅在更改当前调度程序时挂起)、Job.join()
、Deferred.await()
、SendChannel.send()
、ReceiveChannel.receive()
、Flow.collect()
、suspendCoroutine
、和suspendCancellableCoroutine
。其中一些仅在特定条件下挂起如果您查看上述函数的源代码,就会发现它们的级别非常低,直接与Continuation发生冲突,或者具有固有行为。
我可能错过了一些基本级别的挂起函数,但它通常归结为它们中的一个是否在调用堆栈中并遇到挂起的条件。