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

How to replace blocking code for reading bytes in Kotlin

我有 ktor 应用程序,它需要来自多部分的文件,代码如下:

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

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

鉴于 Ktor 作为 non-blocking 暂停 IO 框架的声誉,我很惊讶 FileItem 显然除了阻塞 InputStream API检索它。鉴于此,您唯一的选择似乎是委托给 IO 调度程序:

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