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

标签 kotlin kotlin-coroutines ktor

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

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

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

最佳答案

考虑到 Ktor 作为非阻塞、暂停 IO 框架的声誉,我很惊讶地发现,对于 FileItem 来说,除了阻塞 InputStream API 之外,没有其他任何东西可以检索它。鉴于此,您唯一的选择似乎是委托(delegate)给 IO 调度程序:

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

关于kotlin - 如何替换 Kotlin 中读取字节的阻塞代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56533497/

相关文章:

android - 无法将 Kotlin 序列化添加到 Android 项目

ios - KMM 错误 : This API is internal in ktor and should not be used. 它可能会被删除或更改,恕不另行通知

android - 如何在 Ktor 中设置类似于 Retrofit 的`Retrofit.Builder().baseUrl(baseUrl) 的 basePath?

Kotlin:如何从范围返回一些值?

javascript - 如何在 Android(Java/Kotlin) App 中调用 Javascript 函数?

android - 在 AppWidgetProvider 类中使用哪个协程作用域?

kotlin - 在 Swift 中使用协程流

android - 如何以 MVVM 模式与小部件中的数据库进行交互

database - Ktor与Gradle从环境变量运行配置 “Could not resolve substitution to a value”

kotlin - 如何在kotlin中执行阻塞协程调用并指定线程