2008-10-22 7 views
7

J'ai plusieurs processus surveillant une file d'attente MSMQ. Je veux faire des opérations en plusieurs étapes comme d'abord jeter un coup d'oeil sur le message, puis sur la base de certains critères recevoir le message. Un seul message peut transmettre les critères de réception de plusieurs processus afin que plusieurs processus puissent essayer de recevoir le même message. Est-ce que ces opérations seront thread safe? Si ce n'est pas le cas, que dois-je faire pour empêcher qu'un processus ne reçoive pas le message que l'autre processus a déjà reçu?Le thread MSMQ est-il sécurisé?

Répondre

5

Les opérations elles-mêmes sont thread-safe. Toutefois, si vous effectuez une opération en plusieurs étapes, vous pouvez constater que les résultats ne sont pas cohérents (par exemple, voir si les données sont dans la file d'attente, puis appeler pour recevoir les données, pour découvrir qu'elles ne sont plus présentes).

+2

Veuillez noter: à partir de .NET Framework 4, selon MSDN, 'Seule la méthode GetAllMessages est thread-safe'. Je suggère de mettre à jour la réponse pour refléter ceci, afin que les lecteurs ne soient pas confus. – Iravanchi

14

Selon MSDN:

Seules les méthodes suivantes sont thread-safe: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek et de réception.

+6

Veuillez noter que la version .Net 4 de la documentation de MessageQueue indique que seul GetAllMessages() est thread-safe. Je suppose que c'est un changement réel puisque la documentation erronée aurait vraisemblablement été mise à jour en ligne avec les documents .Net 4. – redcalx

+1

Il a été constaté que la méthode Send() n'était pas thread-safe dans mon test unitaire, le fait de verrouiller l'objet MessageQueue a résolu différentes exceptions nullreference qui étaient lancées dans ma boucle parallèle. – Kaido

+0

@Kaido: Le 'MessageQueue.Send()' débloqué a-t-il entraîné des erreurs? Ou quel était le comportement que vous avez expérimenté? –

6

Vous pouvez être intéressé par un blog entry J'ai écrit sur ce sujet. En résumé, l'API MSMQ C++ est thread-safe, mais toutes les méthodes System.Messaging ne sont pas thread-safe. Dans l'entrée du blog, je discute de la façon d'appeler MessageQueue.Send d'une manière thread-safe.