如何在Kotlin中替换用于读取字节的阻塞代码

时间:2019-06-10 21:02:31

标签: kotlin kotlin-coroutines ktor

我有ktor应用程序,它期望这样的代码中包含多个部分的文件:

multipart.forEachPart { part ->
  when (part) {
    is PartData.FileItem -> {
      image = part.streamProvider().readAllBytes()
    }
    else -> // irrelevant
  }
}    

由于ktor在协程之上运行,因此Intellij IDEA将readAllBytes()标记为不适当的阻塞调用。如何将此阻塞呼叫替换为适当的呼叫?

1 个答案:

答案 0 :(得分:3)

考虑到Ktor作为非阻塞,挂起的IO框架的声誉,我很惊讶地发现,对于FileItem来说,只有阻塞InputStream API能够检索它。鉴于此,您唯一的选择似乎是委托给IO调度程序:

image = withContext(Dispatchers.IO) { part.streamProvider().readBytes() }