7

我有多个进程监视一个 MSMQ 队列。我想做多步骤操作,例如先查看消息,然后根据某些标准接收消息。一条消息可能会通过多个进程的接收标准,因此多个进程可能会尝试接收相同的消息。这些操作会是线程安全的吗?如果不是,我应该怎么做才能防止一个进程无法接收到另一个进程已经收到的消息?

4

3 回答 3

14

根据MSDN

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

于 2008-10-22T06:22:30.593 回答
6

你可能对我写的关于这个主题的博客文章感兴趣。

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

于 2008-10-27T13:16:09.547 回答
5

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

于 2008-10-22T06:20:06.387 回答