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()?这不是一个挂起函数,所以您不需要生成协同程序。