2008-10-22 93 views
7

我有多个进程监视MSMQ队列。我想先执行多步操作,如先查看消息,然后根据某些标准接收消息。单个消息可能会传递多个进​​程的接收标准,以便多个进程可能尝试接收相同的消息。这些操作是否是线程安全的?如果不是,我应该怎么做,以防止一个进程未能收到其他进程已经收到的消息?MSMQ线程安全吗?

回答

5

操作本身是线程安全的。但是,如果执行多步骤操作,则可能发现结果不一致(例如,查看数据是否在队列中,然后调用接收数据,仅发现它不再存在)。

+2

请注意:从.NET Framework 4开始,根据MSDN的说法,“只有GetAllMessages方法是线程安全的”。我建议更新答案以反映这一点,这样读者就不会感到困惑。 – Iravanchi 2014-10-01 13:31:03

14

根据MSDN

只有以下方法是线程安全的:BeginPeek,BeginReceive,EndPeek(IAsyncResult的),EndReceive(IAsyncResult的),GetAllMessages,皮克和接收。

+6

请注意,MessageQueue的.Net 4版本的文档声明只有GetAllMessages()是线程安全的。我会认为这是一个实际的变化,因为错误的文档大概会被更新为符合.Net 4文档。 – redcalx 2012-03-26 13:54:53

6

您可能感兴趣的文章blog entry我写过这个话题。

总之,MSMQ C++ API是线程安全的,但不是所有的System.Messaging方法都是线程安全的。在博客文章中,我将讨论如何以线程安全的方式调用MessageQueue.Send。