我有一堂课,可以非常快地监听来自套接字的事件。我想将这些事件添加到协程Channel
中。使用以下代码:
class MyClass(channel: Channel<String>) : ... {
...
override onMessageReceived(message: String) {
MyScope.launch {
channel.send(message)
}
}
}
这是行不通的,因为有时事件来得太快,以至于由于launch
产生了一个新的协程,并且所有事情并行发生,最终导致发布混乱。如何确保send
的顺序是同步的?
我尝试了newSingleThreadContext
确实有效,但是它被认为是实验性的,并有一条注释说它将最终被删除。我正在寻找更正确,更完整的解决方案。
答案 0 :(得分:1)
您应该使用容量为Channel.UNLIMITED的send
而不是并行启动Channel
,而让onMessageReceived
使用offer
而不是{{ 1}}。
这比每次发送都要启动新工作便宜得多,并且渠道将保留订单