Kotlin-阻塞调用是否使挂起无效?发生';不恰当的阻塞方法调用';警告
考虑以下函数Kotlin-阻塞调用是否使挂起无效?发生';不恰当的阻塞方法调用';警告,kotlin,Kotlin,考虑以下函数 suspend-fun-writeToStream(osw:OutputStreamWriter,text:String)=withContext(Dispatchers.IO){ osw.use{it.write(text)}//AndroidStudio警告有关“write”的信息,这是一个不恰当的阻塞方法调用 } 警告是否意味着该函数实际上没有挂起? 我已经对此进行了调查,根据Tenfour4的评论,似乎警告可能不正确(显然有一些错误): 阻塞调用仍然是阻塞调用,但Disp
suspend-fun-writeToStream(osw:OutputStreamWriter,text:String)=withContext(Dispatchers.IO){
osw.use{it.write(text)}//AndroidStudio警告有关“write”的信息,这是一个不恰当的阻塞方法调用
}
警告是否意味着该函数实际上没有挂起?我已经对此进行了调查,根据Tenfour4的评论,似乎警告可能不正确(显然有一些错误): 阻塞调用仍然是阻塞调用,但Dispatchers.IO可以容忍阻塞调用,因为与Dispatchers.Default不同,它可以创建所需的任意多个线程。如果其他调度程序都被阻塞调用而锁定,则可能会耗尽线程 此代码未显示警告,但显然未挂起:
fun writeToStream(osw:OutputStreamWriter,text:String)=运行阻塞(Dispatchers.IO){
osw.use{it.write(text)}
}
总而言之,阻塞调用是否会抵消挂起的好处?是否有可能拥有使用阻塞调用的suspend函数,并且具有suspend的所有优点?AndroidStudio的警告是否不正确,因为它不知道我使用了
Dispatchers.IO
?我很确定这是一个误报,可能与链接的错误报告中的情况完全相同async
紧跟其后的await()
应该是几乎完全相同的行为,这不会触发警告,而是一个警告,您应该将其替换为withContext()
,从而触发另一个警告。