我正在尝试用Kotlin Coroutines做这件事(这是伪代码):
suspend fun myFunction() {
if (job.isActive) {
job.join()
return job.result
} else {
job.start()
job.join()
return job.result
}
}
基本上,有一个执行一些代码并返回值的作业。然后函数使用该作业。如果作业未启动,它将执行该作业并返回其结果。如果作业已经开始,它将等待完成,然后返回结果。
但不确定如何处理此问题。有什么建议吗?
答案 0 :(得分:0)
class MyClass(override val coroutineContext: CoroutineContext) : CoroutineScope {
private val lazyThing =
async(start = CoroutineStart.LAZY) {
5 // Calculate using suspending functions as necessary
}
suspend fun getThing() = lazyThing.await()
}
lazyThing
最终是Deferred<Int>
。在第一次调用getThing()
之前,不会计算其内容。它只会被计算一次,然后立即返回其值。
答案 1 :(得分:0)
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
fun main() {
println(myFunction())
}
fun myFunction(): Int = runBlocking {
aJobAsync().await()
}
suspend fun aJobAsync(): Deferred<Int> = withContext(Dispatchers.Default) {// use Dispatchers.IO for IO intensive task
async {
2 + 2
}
}
aJobAsync-这将返回延迟的内容,可用于检索作业的返回值
myFunction-是一个runBlocking块,这意味着在调用myFunction时,调用者线程将被阻止。由于我们需要协程范围来调用作业等待状态