Domanda

sto navigando codici sorgente da due applicazioni che condividono una coda utilizzando MSMQ. La prima applicazione ha un filo che scrive nella coda, mentre la seconda applicazione dispone di un altro thread che legge dalla coda. Di solito, se si sta implementando la propria coda, le applicazioni avrebbero bisogno di un mutex quando si accede alla coda, giusto? Tuttavia, non ho potuto trovare qualsiasi sezione mutex / critica nei codici sorgenti di queste applicazioni. Ho appena perso qualcosa? Oppure MSMQ ha bisogno di mutex poiché è gestito internamente, c'è cosa del genere?

È stato utile?

Soluzione

La documentazione MSMQ afferma che:

  

Solo i seguenti metodi sono thread   sicuro: BeginPeek, BeginReceive,   EndPeek (IAsyncResult),   EndReceive (IAsyncResult),   GetAllMessages, Peek e ricezione.

MSMQ.Send () è non inerentemente thread-safe.

  

Invia è thread-safe, fino a quando si   sempre inviare un oggetto Message e mai   utilizzare inviare direttamente un oggetto NET. utilizzando   l'oggetto del messaggio, A proposito, è sempre un   buona idea - dal momento che consente di aggiungere   etichetta, timeout, opzione recuperabile   e tutta questa roba che rendono il vostro MSMQ   soluzione di una vera e propria soluzione enterprise.

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

Da: è inviare () thread-safe ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top