Mutex necessario in MSMQ?
-
22-09-2019 - |
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?
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 ?