gpt4 book ai didi

Kotlin 协程 - 如何在后台运行并在调用者线程中使用结果?

转载 作者:行者123 更新时间:2023-12-02 09:14:43 26 4
gpt4 key购买 nike

主要思想是拥有非挂起函数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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com