Kotlin Coroutine-保持频道发送事件同步

时间:2019-10-23 00:51:09

标签: kotlin channel coroutine

我有一堂课,可以非常快地监听来自套接字的事件。我想将这些事件添加到协程Channel中。使用以下代码:

class MyClass(channel: Channel<String>) : ... {

 ...

  override onMessageReceived(message: String) {
     MyScope.launch {
        channel.send(message)
     }
  }

}

这是行不通的,因为有时事件来得太快,以至于由于launch产生了一个新的协程,并且所有事情并行发生,最终导致发布混乱。如何确保send的顺序是同步的?

我尝试了newSingleThreadContext确实有效,但是它被认为是实验性的,并有一条注释说它将最终被删除。我正在寻找更正确,更完整的解决方案。

1 个答案:

答案 0 :(得分:1)

您应该使用容量为Channel.UNLIMITED的send而不是并行启动Channel,而让onMessageReceived使用offer而不是{{ 1}}。

这比每次发送都要启动新工作便宜得多,并且渠道将保留订单