如何解决无法在协程内部创建局部变量
我是Kotlin协程主题的新手,有一个问题,这完全阻止了我使用它们。我有以下代码与协程一起运行:
runBlocking {
for (i in 0 until args[1].toInt()) {
GlobalScope.launch {
OuterObject().run()
}
}
我的OuterObject类在run()方法中具有以下代码:
override fun run() {
...
logger.info(){ "Checkpoint 0" }
var innerObject: InnerObject = InnerObject(some_parameter = 1)
logger.info(){ "Checkpoint 1" }
...
}
所有协程均从循环开始,但仅到达“检查点0”。尝试创建innerObject后没有日志消息或任何其他操作。
我尝试做的第一件事是创建另一个对象,但是似乎问题很普遍,并且不依赖于对象的类。我已经尝试过使用DateTime(),Gson()和其他一些方法-每当协程在这一点停止。我还尝试将异常处理添加到协程中,但是没有捕获到异常-协程只是默默地停止。
这是什么原因?如何避免?
kotlinx-coroutines-core版本:1.2.2
更新1:
我已经检查了原始类型分配,并且可以正常工作。 “检查点0”和“检查点1”都出现在控制台日志中。问题仅在于复杂类型。
override fun run() {
...
logger.info(){ "Checkpoint 0" }
var test = 1
logger.info(){ "Checkpoint 1" }
...
}
更新2:
@gladed和@Sam,您是对的。 @ roman-elizarov的文章也对我有所帮助:The reason to avoid GlobalScope。从GlobalScope调用“启动”是错误的-它与runBlocking范围无关。
我已通过以下方式修改了代码:
runBlocking {(0 until args[1].toInt()).forEach {
launch(Dispatchers.Default) {
OuterObject().run()
}
}
以这种方式运行代码时,我遇到了其他一些问题,但这是由于不是最佳的并发性。
解决方法
launch()
开始一个新的协程。但是,您不必等待它完成。相反,请考虑:
runBlocking {
(0 until args[1].toInt()).forEach {
launch {
OuterObject().run()
}
}
}
这样,runBlocking
不会返回,直到所有启动的作业完成。 (删除GlobalScope时,请@Sam提供信用。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。