Pergunta

Estou navegando em códigos de origem de dois aplicativos compartilhando uma fila usando MSMQ. O primeiro aplicativo possui um encadeamento que grava na fila, enquanto o segundo aplicativo possui outro thread que lê na fila. Normalmente, se você estiver implementando sua própria fila, os aplicativos precisariam de um Mutex ao acessar a fila, certo? No entanto, não consegui encontrar nenhuma seção mutex/crítica nos códigos de origem desses aplicativos. Acabei de perder alguma coisa? Ou o MSMQ não precisa de nenhum mutex, pois é tratado internamente, existe isso?

Foi útil?

Solução

o MSMQ A documentação afirma que:

Somente os seguintes métodos são seguros de thread: BeginPeek, BeginReceive, EndPeek (IIAsyncresult), EndReceive (IIAsyncresult), GetAllMessages, Peek e Recending.

Msmq.send () é não inerentemente segura por threads.

O envio é seguro, desde que você sempre envie um objeto de mensagem e nunca use, envie um objeto .NET diretamente. Usar o objeto de mensagem, btw, é sempre uma boa ideia - pois permite adicionar rótulo, tempo limite, opção recuperável e tudo isso que faz da sua solução MSMQ uma solução corporativa 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);
        }
    }
}

A partir de: Send () thread é seguro?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top