我和Arrow库一起使用Kotlin。我将在一个特定的范围内启动一些利用Arrow计划的合作项目。
在某个时候,我希望能够取消在这个范围上启动的所有协同机制,但是在我取消了范围之后,基本上没有什么改变,无论在时间表上运行什么,都继续运行,这不是我想要的。
我已经尝试放置了一些but ()调用来强制coroutine是可取消的,但是行为并没有改变。
以下是代码:
发射的主要功能:
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的调度表:
suspend fun startFetching(ball: Ball, periodicity: Periodicity) {
Schedule.forever<Unit>()
.and(Schedule.spaced(periodicity))
.repeat {
yield()
//ball fetching logic here
}
}预期行为:
当调用ballFetchingScope.cancel()时,所有的协同线都被取消,所有获取停止。理想情况下,甚至不需要等待直到它到达not ()调用,如果它正在等待下一次运行,我希望它取消,甚至不启动新的重复块运行。
实际发生了什么:
正常情况下仍会发生抓取。
发布于 2022-09-19 06:45:55
很难说出到底是怎么回事。
非常奇怪的是,这并不适用于您,因为Schedule依赖于KotlinX kotlin.coroutines.delay来执行Schedule.spaced。所以它应该在等待下一轮的时候被取消。
它还会在运行传递给coroutineContext.ensureActive()的函数之前检查repeat,因此它也会自动检查您现在手动放置产生值的位置。
你用的是哪个版本的箭?你能分享一个完全可复制的例子吗?
发布于 2022-09-19 22:29:22
我回我自己的帖子,只是为了确保你不会犯我刚才犯的那个愚蠢的错误。
一切照常进行,问题就在我这一边。我有两个包含ballFetchingScope的类的不同实例
这意味着我在其中一个实例的作用域上调用ballFetchingScope.cancel(),而在另一个实例的作用域上运行Coroutines。
Botom-line:当您认为只有一个实例时,请确保您没有使用多个实例。
https://stackoverflow.com/questions/73767041
复制相似问题