Котлин эквивалентен C # Task.WhenAll - PullRequest
0 голосов
/ 14 октября 2018

Есть ли котлинский эквивалент C # Task.WhenAll ?

Я придумал приведенный ниже код, но мне интересно, можно ли написать whenAll, чтобы он только один раз приостанавливался.

fun main(args: Array<String>) = runBlocking {
    println("Start")
    val serviceA = KotlinServiceA()
    val serviceB = KotlinServiceB()

    val deferredA = async(CommonPool) { serviceA.operationA() }
    val deferredB = async(CommonPool) { serviceB.operationB() }

    var tasks = arrayOf(deferredA, deferredB)
    tasks.whenAll()

    println("End")
}

suspend fun Array<Deferred<Unit>>.whenAll() : Unit {
    for (task in this) {
        task.await()
    }
}

1 Ответ

0 голосов
/ 14 октября 2018

Существует функция awaitAll(), которая выполняет эту работу.

val deferredArray: Array<Deferred<Unit>>  =  arrayOf()
val awaitAllArray = awaitAll(*deferredArray)

Если вы работаете с Collection, тогда вы можете использовать функцию расширения awaitAll()

val deferredList: List<Deferred<Unit>>  =  listOf()
val awaitAllList = deferredList.awaitAll()
...