为什么我取消的协程作业仍然 运行?
Why my canceled coroutine job still running?
我有一个实验协程函数如下
runBlocking {
Log.d("Track", "Launching...")
val job = launch(Dispatchers.IO) {
repeat(2000) {
repeat(2000) {
Log.d("Track", "Suspending...")
}
}
Log.d("Track", "Done...")
}
Log.d("Track", "Launched...")
delay(100)
Log.d("Track", "Canceling...")
job.cancel()
Log.d("Track", "Canceled...")
}
当我 运行 它时,即使在取消之后,协程也会继续 运行ning 作为下面的日志
Track: Launching...
Track: Launched...
Track: Suspending...
Track: Suspending...
Track: Canceling...
Track: Suspending...
Track: Suspending...
Track: Canceled...
Track: Suspending...
Track: Suspending...
Track: Suspending...
Track: Suspending...
:
: (a lot more suspending)
:
Track: Done...
为什么我不能取消协程?我是否应该放一个 yield()
只是为了不时检查以防万一取消它?
显然,取消是合作的,如Kotlin Documentation. We'll need to have either yield()
or check for isActive
所述
我有一个实验协程函数如下
runBlocking {
Log.d("Track", "Launching...")
val job = launch(Dispatchers.IO) {
repeat(2000) {
repeat(2000) {
Log.d("Track", "Suspending...")
}
}
Log.d("Track", "Done...")
}
Log.d("Track", "Launched...")
delay(100)
Log.d("Track", "Canceling...")
job.cancel()
Log.d("Track", "Canceled...")
}
当我 运行 它时,即使在取消之后,协程也会继续 运行ning 作为下面的日志
Track: Launching...
Track: Launched...
Track: Suspending...
Track: Suspending...
Track: Canceling...
Track: Suspending...
Track: Suspending...
Track: Canceled...
Track: Suspending...
Track: Suspending...
Track: Suspending...
Track: Suspending...
:
: (a lot more suspending)
:
Track: Done...
为什么我不能取消协程?我是否应该放一个 yield()
只是为了不时检查以防万一取消它?
显然,取消是合作的,如Kotlin Documentation. We'll need to have either yield()
or check for isActive