- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
主要思想是拥有非挂起函数runInBackgroundAndUseInCallerThread(callback: (SomeModel) -> Unit)
,它在后台(另一个线程)异步运行一些工作,并在工作完成后 - 运行回调在调用者线程中(启动 runInBackgroundAndUseInCallerThread
的线程)。
下面我写了一个示例代码,但我不确定它有多正确以及是否可能。使用 println("1/2/3/...") 我标记了所需的调用顺序。getDispatcherFromCurrentThread
- 如果可以实现这个功能,那么可以使用解决方案,但我不知道如何实现它,这样做是否正确。
因此,请不要将其视为唯一的解决方案。
import kotlinx.coroutines.*
import kotlin.concurrent.thread
fun main() {
println("1")
runInBackgroundAndUseInCallerThread {
println("4")
println("Hello ${it.someField} from ${Thread.currentThread().name}") // should be "Hello TestField from main"
}
println("2")
thread(name = "Second thread") {
runInBackgroundAndUseInCallerThread {
println("5")
println("Hello ${it.someField} from ${Thread.currentThread().name}") // should be "Hello TestField from Second thread"
}
}
println("3")
Thread.sleep(3000)
println("6")
}
fun runInBackgroundAndUseInCallerThread(callback: (SomeModel) -> Unit) {
val dispatcherFromCallerThread: CoroutineDispatcher = getDispatcherFromCurrentThread()
CoroutineScope(Dispatchers.IO).launch {
val result: SomeModel = getModelResult()
launch(dispatcherFromCallerThread) { callback(result) }
}
}
data class SomeModel(val someField: String)
suspend fun getModelResult(): SomeModel {
delay(1000)
return SomeModel("TestField")
}
fun getDispatcherFromCurrentThread(): CoroutineDispatcher {
// TODO: Create dispatcher from current thread... How to do that?
}
最佳答案
除非线程被设计为作为调度程序工作,否则没有通用的方法可以使其这样做。我想到的唯一方法是 runBlocking 是可重入的,并且会在现有线程中创建一个事件循环,但是它将阻止所有非协程代码在该线程上执行,直到就完成了。
最终看起来像:
fun runInBackgroundAndUseInCallerThread(callback: (SomeModel) -> Unit) {
callback(runBlocking(Dispatchers.IO) {
getModelResult()
})
}
关于Kotlin 协程 - 如何在后台运行并在调用者线程中使用结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59486388/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!