具有超时,从不触发Kotlin

ecfdbz9o  于 2023-03-09  发布在  Kotlin
关注(0)|答案(1)|浏览(161)

嘿,所以我试图添加一个超时到我的请求,但它从来没有火这里是我如何调用挂起乐趣:

getSettingJob = CoroutineScope(Dispatchers.IO).launch {
                    getSettings(this@MainActivity)
                }

这是实际的函数

suspend fun getSettings(context: Context?) {
      Timber.i("  Request started ")
      CoroutineScope(Dispatchers.Main).async(Dispatchers.Main) {
        try {
            withTimeout(120000L) {... do stuff}
        }catch(ex : TimeoutCancellationException) {
          ... show error message
        }

      }.await()
 }

我没有收到任何错误,超时只是从来没有触发,这是否与作业在IO上启动和协程范围是主或异步等待的事实有关?两者都说他们是可取消的,所以不确定这应该是它。

jk9hmnmh

jk9hmnmh1#

协程消除是协作的。
https://kotlinlang.org/docs/cancellation-and-timeouts.html#cancellation-is-cooperative
如果协程没有到达挂起点(例如,如果线程被阻塞),它将不会被取消。
要使取消信号到达具有阻塞线程的协程,请使用runInterruptible
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-interruptible.html

// this doesn't throw
withTimeout(100) {
    Thread.sleep(500)
}
println("slept")

// this throws
withTimeout(100) {
    runInterruptible { Thread.sleep(500) }
}

相关问题