首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消自定义CoroutineScope

取消自定义CoroutineScope
EN

Stack Overflow用户
提问于 2021-03-16 08:26:22
回答 1查看 1.4K关注 0票数 3
代码语言:javascript
复制
val scope = CoroutineScope(
        Job() + Dispatchers.Main
)
scope.launch {
    beforeExecute()
    val result = withContext(dispatcher) { doInBackground(*params) }
    if (!isCancelled) {
        postExecute(result)
    } else {
        cancelled(result)
    }
    status = Status.FINISHED
}
scope.cancel()

如果我将scope.cancel()放在外部启动,它会立即取消coroutine,而不会调用启动块code.Is ?为什么会发生这种情况?如果我想让coroutine在启动过程中执行代码,那么是否应该将取消放置在启动块的末尾?

更新

根据侯禄的回答和马科·托波尼克的评论,

“在启动结束时,我认为任务已经完成,您不需要手动取消Coroutine。

“一旦完成任务,协同线就会从内存中消失。

但是在第二种情况下,如果我启动另一次启动,它就会被执行,除非我们取消了第一次启动中的协同线,就像在案例1中那样。那么,在任务完成后,coroutine是否会在没有手动调用cancel()的情况下从内存中消失?Bcoz编译器将永远不知道它将执行的最后一个启动,在此之后,它需要结束coroutine。

案例1

代码语言:javascript
复制
scope.launch {
    Log.e("Task","1");
    scope.cancel()
}
scope.launch {
    Log.e("Task","2");
}

只打印任务1

案例2

代码语言:javascript
复制
scope.launch {
    Log.e("Task","1");
}
scope.launch {
    Log.e("Task","2");
}

任务1和2都是打印的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-16 09:36:45

您的代码可以转换为“在执行scope.launch之后立即取消给定的协同”,因此我认为这是预期的行为。

至于另一个问题,我们只想在执行过程中出现问题时取消协同机制--嘿,协同机制,在我给您的任务执行过程中。如果有什么不对的事情发生。自杀吧。因此,在启动结束时,我认为任务已经完成,您不需要手动取消Coroutine。

更新:我写这个作为答案,因为我不能在注释中写代码。

CoroutineScope被设计成对创建/启动/容纳协同线的对象的生命周期做出反应。因此,当您在CoroutineScope上调用cancel方法时,您将停止所有操作。停止而不是取消。由该作用域创建的所有子协同,它们正在执行的所有作业,全部取消,仅此而已。任务完成了。这就是为什么你不能在scope.cancel之后再启动一次

CoroutineScope将通过创建器和异步等构建器方法来创建并保存一堆Corrountine的引用。当你想要取消一个特定的Coroutine时。您需要取消由生成器返回的作业。而不是取消它们所在的范围。

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html

代码语言:javascript
复制
val job1 = scope.launch{ print('Task 1') }
job1.cancel()
val job2 = scope.launch{ print('Task 2') }

任务2将以正常方式打印。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66651468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档