为什么我取消的协程作业仍然 运行?

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

所述