Mutex necesario en MSMQ?
-
22-09-2019 - |
Pregunta
Estoy navegando códigos fuente a partir de dos aplicaciones que comparten una cola utilizando MSMQ. La primera aplicación tiene un hilo que escribe en la cola, mientras que la segunda aplicación tiene otro hilo que lee de la cola. Por lo general, si va a implementar su propia cola, las aplicaciones necesitarían un mutex cuando se accede a la cola, ¿verdad? Sin embargo, no pude encontrar ninguna sección mutex / crítico en los códigos fuente de estas aplicaciones. Qué acabo perdido algo? O hace MSMQ no necesita ninguna exclusión mutua, ya que se maneja internamente, ¿existe tal cosa?
Solución
MSMQ documentación indica que:
Sólo los siguientes métodos son hilo segura: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek y recibir.
MSMQ.Send () es no inherentemente seguro para subprocesos.
Enviar es seguro para hilos, siempre y cuando se Siempre enviar un objeto de mensaje y nunca utilizar enviar un objeto .NET directamente. Utilizando el objeto del mensaje, por cierto, es siempre una buena idea - ya que le permite añadir etiqueta, los tiempos de espera, opción recuperable y todas esas cosas que hacen que su MSMQ solución de una solución empresarial real.
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); } } }