我想从coroutines中同步访问一个代表我的状态的变量。我如何解决这个问题?
private var myState: MyState? = null
get() = mutex.withLock {
return@withLock myState
}
set(value) = mutex.withLock {
field = value
}
private val mutex = Mutex()
现在我得到的是 Suspend function 'withLock' should be called only from a coroutine or another suspend function
如果不可能的话,有什么其他优雅的解决方案吗?
要在非暂停的上下文中调用暂停函数。你可以使用 runBlocking
.
private var myState: MyState? = null
get() {
return runBlocking {
mutex.withLock {
myState
}
}
}
set(value) {
runBlocking {
mutex.withLock {
field = value
}
}
}
private val mutex = Mutex()
注意事项。
你可能最好将属性改为两个暂停函数(gettersetter),而不是使用 runBlocking
.所有这些都取决于你在什么情况下调用 myState
.
你也可以考虑投票给 KT-15555.