Нерешенная ссылка: асинхронность в Котлине в 1.3 - PullRequest
0 голосов
/ 21 января 2019

У меня есть мультимодульный проект kotlin gradle в github здесь .

Одна из моих подпрограмм, представляющих сопрограммы с файлом сборки, файл build.gradle.kts: здесь

Содержимое build.gradle.kts -

    import org.jetbrains.kotlin.gradle.dsl.Coroutines
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

    plugins {
        java
        kotlin("jvm") version "1.3.11"
    }

    group = "chapter2"
    version = "1.0-SNAPSHOT"

    repositories {
        mavenCentral()
    }

    dependencies {
        compile(kotlin("stdlib-jdk8"))
        compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.0")
        testCompile("junit", "junit", "4.12")
    }

    configure<JavaPluginConvention> {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }

    kotlin {
        experimental {
            coroutines   = Coroutines.ENABLE
        }
    }

Я пытаюсь создать свою первую программу сопрограмм по этой ссылке .

import kotlinx.coroutines.*
import kotlinx.coroutines.async
import kotlin.system.*
import kotlin.system.measureTimeMillis

suspend  fun computecr(array: IntArray, low: Int, high: Int): Long {
    return if (high - low <= SEQUENTIAL_THRESHOLD) {
        (low until high)
                .map { array[it].toLong() }
                .sum()
    } else {
        val mid = low + (high - low) / 2
        val left = async { computecr(array, low, mid) }
        val right = compute(array, mid, high)
        return left.await() + right
    }
}

Когда я компилирую программу, я получаю следующую ошибку -

e: /Users/rajkumar.natarajan/Documents/Coding/coroutines-demo/introducing-coroutines/src/main/kotlin/SumUsingCoroutines.kt: (15, 20): Unresolved reference: async
> Task :introducing-coroutines:compileKotlin FAILED

FAILURE: Build failed with an exception.

Я могу импортировать import kotlinx.coroutines.async без каких-либо проблем, но не уверен, почему я получаю эту ошибку.

enter image description here

Я уже подтвердил подобную проблему здесь и добавил anko-commons зависимость здесь

Как я могу устранить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Прежде всего вы должны удалить из Gradle часть, в которой вы включили экспериментальную функцию сопрограммы.

kotlin {
    experimental {
        coroutines   = Coroutines.ENABLE
    }
}

Вы не можете больше использовать функцию async() неявно.Вы должны вызывать его явно для сопрограммы глобальной области действия GlobalScope.async(){...}, или вы можете вызвать ее из другой области сопрограммы, используя CoroutineScope(...).async{...} или из функций определения области действия coroutineScope {...}, withContext(...){...}.

Я написал пример для личного использования, чтобы понять, как работают сопрограммы.Я надеюсь, что это хорошо и полезно.

0 голосов
/ 21 января 2019

Проблема в том, что async (аналогично launch) определено как функция расширения для CoroutineScope.В следующем примере он вызывается в получателе CoroutineScope из withContext:

suspend  fun computecr(array: IntArray, low: Int, high: Int): Long {
    return if (high - low <= SEQUENTIAL_THRESHOLD) {
        (low until high)
            .map { array[it].toLong() }
            .sum()
    } else {
        withContext(Default) {
            val mid = low + (high - low) / 2
            val left = async { computecr(array, low, mid) }
            val right = computecr(array, mid, high)
            left.await() + right
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...