我正在尝试对CoroutineScope
使用扩展功能来启动一些异步工作。
我不确定如何从主类中调用此方法,请参见下文:
class MyService {
fun CoroutineScope.getFoo() = async(IO|Single|Default) { ... }
}
class MyProgram(val service : MyService) : CoroutineScope {
fun main() {
launch {
// Doesn't work, unresloved `service.getFoo`.
val deferred = service.getFoo() getFoo
// Works, but looks a bit odd IMO.
val deferred = with(service) { getFoo() }
deferred.await()
}
}
}
我知道我可以将
async {}
关键字移到我的主要方法中,但是以这种方式,调用者必须决定调度程序。该服务知道其工作的性质(IO /计算绑定(bind)单线程?等),我认为它应该是决定调度程序的一种。
最佳答案
据我了解,您的意图是让服务指定调度程序。为什么不拆分调度程序的规范和异步运行的决定?
让服务函数可挂起,并使用withContext
指定调度程序。
然后让调用者确定函数是否应该异步运行。
class MyService {
suspend fun getFoo() = withContext(Dispatchers.IO) {
//work
}
}
abstract class MyProgram(val service: MyService) : CoroutineScope {
fun main() {
launch {
val deferred = async { service.getFoo() }
//some work
deferred.await()
}
}
}
关于kotlin - 不同类中的CoroutineScope扩展功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55152122/