是否有可能暂停一个协程超时?

usb*_*102 4 kotlin kotlin-coroutines

我想要的是这样的功能:

suspendCoroutineWithTimeout(timeout: Long, unit: TimeUnit, crossinline block: (Continuation<T>) -> Unit)
Run Code Online (Sandbox Code Playgroud)

这与现有suspendCoroutine函数基本相同,但是如果回调或块中提供的任何内容不会在指定的超时内被调用,则corutine会继续,但会出现TimeoutException或类似的情况.

Rom*_*rov 14

您可以以简单的方式组合withTimeoutsuspendCancellableCoroutine获得所需的效果:

suspend inline fun <T> suspendCoroutineWithTimeout(
    timeout: Long, unit: TimeUnit,
    crossinline block: (Continuation<T>) -> Unit
) = withTimeout(timeout, unit) {
    suspendCancellableCoroutine(block = block)
}
Run Code Online (Sandbox Code Playgroud)


feb*_*isi 5

来自@Roman Elizarov 的完美回答.. 只是在上面加上我的 2 美分,因为我需要从那个电话中得到回报..所以添加 T?返回它会是...

suspend inline fun <T> suspendCoroutineWithTimeout(timeout: Long, crossinline block: (Continuation<T>) -> Unit ) : T? {
    var finalValue : T? = null
    withTimeoutOrNull(timeout) {
        finalValue = suspendCancellableCoroutine(block = block)
    }
    return finalValue
}
Run Code Online (Sandbox Code Playgroud)