Mutex nécessaire dans MSMQ?
-
22-09-2019 - |
Question
Je surfe les codes sources de deux applications partageant une file d'attente à l'aide MSMQ. La première application a un fil qui écrit dans la file d'attente tandis que la deuxième application a un autre thread qui lit à partir de la file d'attente. Ordinairement, si vous implémentez votre propre file d'attente, les applications auraient besoin d'un mutex lors de l'accès à la file d'attente, non? Cependant, je ne pouvais pas trouver mutex / section critique dans les codes sources de ces applications. Je ne manque quelque chose? Ou ne MSMQ pas besoin de mutex car il est géré en interne, est-il une telle chose?
La solution
La documentation MSMQ indique que:
Seules les méthodes suivantes sont fil sécurité: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek et Recevoir.
MSMQ.Send () est pas intrinsèquement thread-safe.
Envoyer est thread-safe, aussi longtemps que vous toujours envoyer un objet de message et ne utiliser envoyer un objet .NET directement. En utilisant l'objet du message, BTW, est toujours bonne idée - car il vous permet d'ajouter étiquette, les délais d'attente, l'option récupérable et tout ce genre de choses qui font que votre MSMQ solution une véritable solution d'entreprise.
class Program { static MessageQueue outQueue; static void Main(string[] args) { outQueue = new MessageQueue(@".\private$\mtQueue"); for (int i = 0; i < 100; i++) { Thread thr = new Thread(new ThreadStart(MyThreadProc)); thr.Start(); } } static void MyThreadProc() { Message msg = new Message(); for (int i = 0; i < 100; i++) { msg.Label = string.Format("{0} : {1}", Thread.CurrentThread.ManagedThreadId, i); outQueue.Send(msg); } } }