由于源代码中有多种实现,因此异步无法编译

时间:2018-11-14 17:54:18

标签: kotlin coroutine kotlinx.coroutines

我正在尝试运行以下代码,但未运行,因为编译器不知道调用哪个版本的async方法。我该如何告诉该打给谁?

v

ar counter=0
val workerA=asyncIncrement(5000)
val workerB=asyncIncrement(100)
workerA.await()
workerB.await()

print("counter = $counter")

fun asyncIncrement(by:Int)=async{
    for(i in 1..by){
        counter++
    }
}

只需将代码复制并粘贴到暂存文件中或任何地方,您应该会看到相同的编译器错误

1 个答案:

答案 0 :(得分:0)

从Kotlin 1.3开始,您需要在示波器上调用async。在这个例子中,我选择了 GlobalScope。但是选择哪个范围都没有关系,您始终必须显式导入async扩展功能;

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import java.util.concurrent.atomic.AtomicInteger


fun main(args: Array<String>) {

    val counter=AtomicInteger(0)

    fun asyncIncrement(by:Int)= GlobalScope.async{
        for(i in 1..by){
            counter.incrementAndGet()
        }
    }

    val workerA=asyncIncrement(5000)
    val workerB=asyncIncrement(100)
    runBlocking {
        workerA.await()
        workerB.await()
    }

    print("counter = $counter")
}

顺便说一句: 我将变量counterint更改为AtomicInteger,因为两个async块可能在不同的线程中运行。我介绍了runBlocking,因为await必须在暂挂函数中运行。