MSMQ线程安全吗?

Ram*_*der 7 multithreading msmq

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

Dar*_*der 14

根据MSDN:

只有以下方法是线程安全的:BeginPeek,BeginReceive,EndPeek(IAsyncResult),EndReceive(IAsyncResult),GetAllMessages,Peek和Receive.

  • 请注意,MessageQueue文档的.Net 4版本声明只有GetAllMessages()是线程安全的.我认为这是一个实际的变化,因为错误的文档可能已经与.Net 4文档一致更新. (6认同)

小智 6

您可能对我就此主题撰写的博客文章感兴趣.

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


Bra*_*son 5

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

  • 请注意:从.NET Framework 4开始,根据MSDN,"只有GetAllMessages方法是线程安全的".我建议更新答案以反映这一点,这样读者就不会感到困惑. (3认同)