使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(或者至少直到循环自然结束)。