使Kotlin暂停功能可取消
我想使挂起功能可取消,但无法访问使Kotlin暂停功能可取消,kotlin,Kotlin,我想使挂起功能可取消,但无法访问isActive。这是自动处理的吗 suspend fun coolFunction() { while (isActive) { /* Do cool stuff */ } } 您可以取消正在运行挂起功能的作业或协同作用域,以便挂起功能将取消 private suspend fun CoroutineScope.cancelComputation() { println("cancelComputation(
isActive
。这是自动处理的吗
suspend fun coolFunction() {
while (isActive) {
/* Do cool stuff */
}
}
您可以取消正在运行挂起功能的作业或协同作用域,以便挂起功能将取消
private suspend fun CoroutineScope.cancelComputation() {
println("cancelComputation()")
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nextPrintTime = startTime
var i = 0
// WARNING To cooperate with cancellation, you can periodically suspend, most simply done by calling yield()
suspend fun coolFunction() {
while (true) {
yield()
/* Do cool stuff */
}
}
private-suspend-fun-CoroutineScope.cancelComputation(){
println(“取消计算()”)
val startTime=System.currentTimeMillis()
val job=launch(Dispatchers.Default){
var nextPrintTime=startTime
变量i=0
//警告要配合取消,您可以定期暂停,最简单的方法是调用yield()
您还可以通过选中CoroutineScope.isActive
来支持取消。但是,挂起函数本身不能直接访问调用它的CoroutineScope。您必须使用类似于coroutineContext[Job]的东西!!.isActive
,这很笨拙。isActive
在您直接使用类似于launch
的功能而不是可以从任何范围调用的suspend
函数组成协同程序时更有用。该函数如何取消?如果它有一些开放的资源,它应该关闭呢?它只是c吗当工作被取消时,你会变得鲁莽和焦躁?官方文件是你能了解协同程序工作原理的最好方法之一,你可以查看它,如果你对反应式编程感兴趣,我建议在协同程序后学习flow
。我看过官方文件,他们并没有告诉我我想知道什么。例如,他们说像delay
这样的内置函数在其协同进程被取消时会抛出一个取消异常。那么该函数如何知道何时被取消?这基本上就是我想知道的。flow
实际上不适用,我不认为。我的函数执行一个可能长时间运行的进程,然后返回一个值。如果您正在使用资源,则需要使用try finally或Closeable。像往常一样使用,以便在取消时清理资源。因此,如果取消,它将跳到finally?官方文档表明,不检查取消的循环将继续永远使用nue(或者至少直到循环自然结束)。