是否可以为当前线程创建一个 Dispatcher
?检查此示例代码作为我想要完成的示例:
val dispatcher = if (parallel) {
Dispatcher.Default
} else {
// What should I write here so I just use the current thread to run doStuff?
}
val deferredList = list.map {
async(dispatcher) { doStuff(it) }
}
答案 0 :(得分:2)
当你构建一个协程时,你传递了一个 CoroutineContext
作为参数。如果您不传递任何内容,新协程将使用当前 CoroutineContext
(其父级上下文)构建。
您应该瞄准 Dispatcher
而不是 CoroutineContext
:
val context = if (parallel) {
Dispatchers.Default
} else {
coroutineContext
}
val deferredList = list.map {
async(context) { doStuff(it) }
}
您还可以使用 Element
类型作为键单独“提取”上下文的每个 Element
:
工作: coroutineContext[Job]
调度员: coroutineContext[ContinuationInterceptor]
ExceptionHandler: coroutineContext[CoroutineExceptionHandler]
姓名: coroutineContext[CoroutineName]
答案 1 :(得分:0)
使用Dispatchers.Unconfined,它正好用于在当前线程上运行。
整个代码如下:
val dispatcher = if (parallel) Dispatcher.Default else Dispatchers.Unconfined
val deferredList = list.map {
async(dispatcher) { doStuff(it) }
}