fun startAsyncFunc() {
launch {
asyncFunc1()
asyncFunc2()
}
}
fun asyncFunc1() { ... }
suspend fun asyncFunc2() { ... }
我可以在没有挂起
的情况下完成工作,甚至使测试变得更容易(可以在不添加runBlocking
的情况下进行测试。
我的问题:
asyncFunc1
与asyncFunc2
哪个更好,为什么?- 如果
asyncFunc2
更好,那么每当函数在协程中运行时我是否应该始终使用suspend
?
更新
在 Kotlin 协程的最新版本中,我注意到如果一个方法不包含任何协程代码(例如 launch
、async
等),编译器会提示如果内部没有调用其他挂起函数,此检查会将挂起修饰符报告为冗余
。所以我认为 挂起
应该只在必须时使用。
更新2
最佳答案
作为一般经验法则,只有在编译器强制时才应声明函数挂起
。
此规则的一个可能的异常(exception)是,如果您将此函数定义为开放方法(例如在接口(interface)中),并且您预计某些实现/覆盖需要自行调用挂起函数。
值得注意的是,在协程世界中,暂停和取消都是协作的。这意味着标记函数挂起
本身不会执行任何操作。如果你没有在其中调用挂起函数,或者手动检查取消状态,那么将其标记为 挂起
可能弊大于利(因为机器有成本,但你从中得不到任何好处)在本例中就是这样)。
大多数时候,如果您有充分的理由让函数挂起,则意味着它可能正在执行某些需要您调用挂起函数的操作。例如,您可以使用 withContext
切换到特定线程池,或者可以使用 suspendCancellableCoroutine
包装基于回调的函数。无论哪种方式,调用这些函数都会强制您将 suspend
修饰符添加到您的函数中。
另请注意,声明函数挂起
并不能使调用者执行比函数未挂起时更多的操作。如果有的话,那就是您限制了函数的使用。
关于kotlin - 何时使用 Kotlin suspend 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54554753/