从 withTimeout 获取值

Get value from withTimeout

我是 运行 一个正在读取 receiverChannel 的协程。我已经将这个协程包裹在超时内,我想在超时取消之前获取它设法读取的消息数。这是我拥有的:

runBlocking {    
    val receivedMessages = withTimeoutOrNull(someTimeout) {
        var found = 0
        while (isActive && found < expectedAmount){
            val message = incomming.receive()
            // some filtering
            found++
        }
        found
    } ?: 0 // <- to not have null...

    // Currently prints 0, but I want the messages it managed to read
    println("I've received $receivedMessages messages") 
}

我知道我可以使用 atomicInteger,但我想在此处远离 java 细节

协程中的局部变量不需要是原子的,因为 happens-before guarantee 即使可能有一些线程交换正在进行。您的代码没有任何并行性,因此您可以使用以下代码:

runBlocking {    
    var receivedMessages = 0
    withTimeoutOrNull(someTimeout) {
        while (isActive && receivedMessages < expectedAmount){
            val message = incomming.receive()
            // some filtering
            receivedMessages++
        }
    }

    println("I've received $receivedMessages messages") 
}

如果您确实有多个并行的子协程 运行,您可以使用 Mutex。 More info here