2012-04-01 37 views
1

有消息到达/我怎样才能抵达发送到mailboxprocessor,订单中的mailboxprocessor

这是消息的发布顺序上的保证,在一个线程,如果我做

agent.post(msg1) 
agent.post(msg2) 

我如何确定在代理的处理循环中,消息会按顺序接收?

回答

3

他们是。 Post的实现就像您猜测的那样,它只是将一个项目添加到队列中(在当前线程上,在一个锁下),并且posts会通知任何等待的代理来唤醒并处理它。因此,如果您在同一个线程上一次又一次地调用Post两次,则消息将按照该顺序进入队列。

+0

我需要进一步调查。因为我在接收时在存储数据的并发队列中添加了无序元素。我添加了一个没有的最后一条消息的问题,在发布最后一条消息之后发出信号结束。我刚刚添加了一个布尔到另一个消息,说他们是否是最后一个。 – nicolas 2012-04-01 22:41:18

+0

我为每个接收到的消息跨越一个新的线程,以便不阻止写入,因为我的阅读是从同一代码中的阻塞集合完成的。糟糕的主意,因为我放松对订购的控制! – nicolas 2012-04-02 09:49:20

0

如果您有某种检测顺序的方法,您还可以使用inbox.Scan(function _ -> None // return an Option)来查找消息。当然,这是以性价比为代价的,所以单独留队是最好的选择。