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
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).
Selon MSDN:
Seules les méthodes suivantes sont thread-safe: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek et de réception.
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
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
@Kaido: Le 'MessageQueue.Send()' débloqué a-t-il entraîné des erreurs? Ou quel était le comportement que vous avez expérimenté? –
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.
- 1. Le thread DocumentBuilder.parse() est-il sécurisé?
- 2. Le thread HtmlCleaner est-il sécurisé?
- 3. Le thread HttpSession est-il sécurisé?
- 4. Le thread NSURLConnection est-il sécurisé?
- 5. Le thread Component.getGraphicsConfiguration est-il sécurisé?
- 6. Le thread MSXML4 est-il sécurisé?
- 7. Le thread SecureRandom est-il sécurisé?
- 8. Delphi - Le thread TClientDataset est-il sécurisé?
- 9. Log4Net FileAppender n'est pas un thread sécurisé?
- 10. Le thread PrintWriter d'une socket Java est-il sécurisé?
- 11. Le thread de proxy client xfire est-il sécurisé?
- 12. BinaryFormatter Sérialiser et désérialiser le thread est-il sécurisé?
- 13. Comment écrire un service WCF multi-thread transactionnel consommant MSMQ
- 14. C#: Comment rendre un thread IEnumerable <T> sécurisé?
- 15. L'accès à différents index d'un thread TObjectList est-il sécurisé?
- 16. MSMQ avec le problème WCF
- 17. RichFaces sur le site sécurisé
- 18. Ce code est-il sécurisé?
- 19. Redondance MSMQ
- 20. Le nouveau thread bloque toujours l'UI-Thread
- 21. Accès MSMQ refusé
- 22. Évolutivité MSMQ
- 23. Moniteur MSMQ
- 24. Surveillance MSMQ
- 25. Classe d'enregistreur de fichier non bloquant simple, à thread sécurisé, dans C#
- 26. Le threads EPiServer est-il sécurisé?
- 27. PHP pour lire le fichier sécurisé
- 28. web.config répertoire sécurisé avec le groupe gal
- 29. MSMQ Design Question
- 30. Duplex MSMQ Channel?
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