Kotlin协程-保持通道发送事件同步
我有一门课,它以非常快的速度听来自插座的事件。我想将这些事件馈送到一个协同程序Kotlin协程-保持通道发送事件同步,kotlin,channel,coroutine,Kotlin,Channel,Coroutine,我有一门课,它以非常快的速度听来自插座的事件。我想将这些事件馈送到一个协同程序频道。使用以下代码: class MyClass(channel: Channel<String>) : ... { ... override onMessageReceived(message: String) { MyScope.launch { channel.send(message) } } } class MyClass(频道:频道):。。。
频道
。使用以下代码:
class MyClass(channel: Channel<String>) : ... {
...
override onMessageReceived(message: String) {
MyScope.launch {
channel.send(message)
}
}
}
class MyClass(频道:频道):。。。{
...
覆盖onMessageReceived(消息:字符串){
MyScope.launch{
频道发送(消息)
}
}
}
这不起作用,因为有时事件来得太快,以至于由于launch
产生了一个新的协同程序,并且所有事情都是并行发生的,因此它们最终被发布出了无序状态。如何确保发送的顺序是同步的
我尝试了newSingleThreadContext
,它确实起了作用,但是它被认为是实验性的,并且有一条注释说它最终会被删除。我正在寻找一个更正确、更完整的解决方案。不要并行启动send
s,你应该使用容量为Channel.UNLIMITED的Channel
,并让onMessageReceived
使用offer
而不是send
这比为每次发送启动新作业要便宜得多,而且频道将保留订单您是否尝试调用offer()而不是send()?这不是一个挂起函数,所以您不需要生成协同程序。