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

Izb*_*gen 3 kotlin ktor kotlin-coroutines

我有一个ktor应用程序,它需要像这样的代码中的 multipart 文件:

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

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

Mar*_*nik 7

鉴于 Ktor 作为非阻塞、暂停 IO 框架的声誉,我很惊讶显然FileItem除了阻塞InputStreamAPI 之外别无他物来检索它。鉴于此,您唯一的选择似乎是委托给 IO 调度员:

image = withContext(Dispatchers.IO) { part.streamProvider().readBytes() }
Run Code Online (Sandbox Code Playgroud)