簡體   English   中英

Kotlin withTimeout 在 Intellij gradle 項目中不起作用

[英]Kotlin withTimeout does not work in Intellij gradle project

運行以下代碼給我錯誤的結果:

代碼

import kotlinx.coroutines.*

fun timeElapsed(nano: Long, msg: String){
    println("$msg milliseconds: ${(System.nanoTime()-nano)/1000000}")
}
suspend fun main(): Unit = coroutineScope {
    val start = System.nanoTime()
    withTimeout(700) { 
        println("in timout")
        timeElapsed(start, "timeout before delay")
        delay(900)
        println("not show?")
    }
}

錯誤的結果

in timout
timeout before delay milliseconds: 16
not show?
Exception in thread "main" kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 700 ms

https://play.kotlinlang.org/上運行給我預期的結果:

in timout
timeout before delay milliseconds: 27
Exception in thread "main" kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 700 ms

我的 gradle 設置

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.6.21'
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.21'
}

group 'intro-coroutines'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    implementation "org.jetbrains.kotlin:kotlin-reflect"
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2")

    def coroutines_version = '1.6.1'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-swing:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-debug:$coroutines_version"

Intellij 版本:Build #IU-221.5080.210,於 2022 年 4 月 11 日構建

kotline 插件版本:221-1.7.0-Beta-release-135-IJ5080.210

Java SDK:JavaSE-1.8

go 可能有什么問題?

最后,我弄清楚了原因,完全是我的錯:

我在同一個 package 的另一個 Kotlin 文件中定義了一個 delay() function 如下:

suspend fun delay(timeMillis: Long): Unit =
    suspendCoroutine { cont ->
        executor.schedule({
            cont.resume(Unit)
        }, timeMillis, TimeUnit.MILLISECONDS)
    }

由於此延續是不可取消的,因此延遲不可取消,對不起:吸取教訓,function 應該是私有的,並檢查導入!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM