CoroutineScope 扩展函数在不同的类中



我正在尝试使用扩展函数来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/计算绑定单线程?等),我认为它应该是决定调度程序的人。

据我了解,您的意图是让服务指定调度程序。为什么不拆分调度程序的规范和异步运行的决定?

让服务功能可挂起,并使用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()
}
}
}

为什么不让getFoo成为一个普通的函数并在作用域中传递:

fun getFoo(scope: CoroutineScope) = scope.async {
//work }
}
launch {
service.getFoo(this)
}

相关内容

  • 没有找到相关文章

最新更新