我正在尝试对CoroutineScope.()
使用扩展功能来启动一些异步工作。
我不确定如何从主类中调用此方法,请参见下文:
class MyService {
fun CoroutineScope.getFoo() = async(IO/Single/Default) { //work }
}
class MyProgram(val service : MyService) : CoroutineScope {
fun main() {
launch {
val deferred = service.getFoo() // doens't work, can't find getFoo
// works, but looks a bit odd IMO, is there a better way?
val deferred = with(service) { getFoo() }
//some work
deferred.await()
}
}
}
我知道我可以将async {}
关键字移到我的主要方法中,但是以这种方式,调用者将不得不确定调度程序,我不认为这是要走的路。
该服务知道其工作的性质(IO /计算绑定单线程?等),我认为应该由它来决定调度程序。
答案 0 :(得分:1)
为什么不使getFoo
成为普通函数并传递范围:
fun getFoo(scope: CoroutineScope) = scope.async {
//work }
}
launch {
service.getFoo(this)
}
答案 1 :(得分:1)
据我了解,您的意图是让服务指定调度程序。为什么不拆分调度程序的规范和异步运行的决定?
让服务功能可挂起,并使用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()
}
}
}