首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin + Arrow-kt -为什么我的合作关系不能正常取消?

Kotlin + Arrow-kt -为什么我的合作关系不能正常取消?
EN

Stack Overflow用户
提问于 2022-09-18 23:30:20
回答 2查看 40关注 0票数 0

我和Arrow库一起使用Kotlin。我将在一个特定的范围内启动一些利用Arrow计划的合作项目。

在某个时候,我希望能够取消在这个范围上启动的所有协同机制,但是在我取消了范围之后,基本上没有什么改变,无论在时间表上运行什么,都继续运行,这不是我想要的。

我已经尝试放置了一些but ()调用来强制coroutine是可取消的,但是行为并没有改变。

以下是代码:

发射的主要功能:

代码语言:javascript
复制
    private val ballFetchingScope= CoroutineScope(CoroutineName("ball-fetching"))
    fun fetchBalls(periodicity: Periodicity) {
        val balls = stockRepository.getAllBalls() //basically a list of different balls

        balls.forEach {
                ballFetchingScope.launch(Dispatchers.IO) { ballFetcher.startFetching(it, periodicity) }
        }
    }

startFetching函数,使用Arrow的调度表:

代码语言:javascript
复制
    suspend fun startFetching(ball: Ball, periodicity: Periodicity) {

        Schedule.forever<Unit>()
            .and(Schedule.spaced(periodicity))
            .repeat {
                yield()
                //ball fetching logic here
            }
    }

预期行为:

当调用ballFetchingScope.cancel()时,所有的协同线都被取消,所有获取停止。理想情况下,甚至不需要等待直到它到达not ()调用,如果它正在等待下一次运行,我希望它取消,甚至不启动新的重复块运行。

实际发生了什么:

正常情况下仍会发生抓取。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-19 06:45:55

很难说出到底是怎么回事。

非常奇怪的是,这并不适用于您,因为Schedule依赖于KotlinX kotlin.coroutines.delay来执行Schedule.spaced。所以它应该在等待下一轮的时候被取消。

它还会在运行传递给coroutineContext.ensureActive()的函数之前检查repeat,因此它也会自动检查您现在手动放置产生值的位置。

你用的是哪个版本的箭?你能分享一个完全可复制的例子吗?

票数 1
EN

Stack Overflow用户

发布于 2022-09-19 22:29:22

我回我自己的帖子,只是为了确保你不会犯我刚才犯的那个愚蠢的错误。

一切照常进行,问题就在我这一边。我有两个包含ballFetchingScope的类的不同实例

这意味着我在其中一个实例的作用域上调用ballFetchingScope.cancel(),而在另一个实例的作用域上运行Coroutines。

Botom-line:当您认为只有一个实例时,请确保您没有使用多个实例。

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

https://stackoverflow.com/questions/73767041

复制
相关文章

相似问题

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