我正在尝试对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/

10-14 07:29