如何检查协程是否使用相同的上下文?

J_S*_*ton 4 android kotlin kotlin-coroutines

我有两个协程,我想检查它们是否在同一上下文/调度程序中运行。这是我的问题的简化版本,但答案将适用于我正在做的事情:

@Test
fun test() {
   val io = runBlocking(Dispatcher.IO) {
       coroutineContext
   }
   val nonIo = runBlocking() {
       coroutineContext
   }
   assertNotEquals(io, nonIo)
}
Run Code Online (Sandbox Code Playgroud)

然而,这是一个糟糕的测试,因为我只是比较两个不同的对象。我想比较一下他们用Dispatcher.IO还是不用。

Ten*_*r04 5

我想你的意思是问协程是否使用相同的调度程序,对吧?调度程序只是 CoroutineContext 的一部分。您可以使用getCoroutineContext 的函数和 keyContinuationInterceptor来检索 Dispatcher。

val io = withContext(Dispatchers.IO) {
    coroutineContext[ContinuationInterceptor]
}
val nonIo = withContext(Dispatchers.Default) {
    coroutineContext[ContinuationInterceptor]
}
assertNotEquals(io, nonIo)
Run Code Online (Sandbox Code Playgroud)