2008-10-22 26 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。