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?

¿Fue útil?

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);
        }
    }
}

De: es enviar () seguro para hilos ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top