Mutex benötigt in MSMQ?
-
22-09-2019 - |
Frage
Ich bin gerade Quellcodes von zwei Anwendungen teilen eine Warteschlange MSMQ verwenden. Die erste Anwendung hat ein Gewinde, das in die Warteschlange schreibt, während die zweite Anwendung einen anderen Thread aufweist, die von der Warteschlange liest. Normalerweise sind, wenn Sie Ihre eigene Warteschlange Implementierung würden die Anwendungen einen Mutex benötigen, wenn die Warteschlange zugreifen, nicht wahr? Allerdings konnte ich keine Mutex / kritischen Abschnitt in dem Quellcodes dieser Anwendungen finden. Habe ich vermisse nur etwas? Oder hat MSMQ keine Mutex müssen, da sie intern gehandhabt wird, gibt es so etwas?
Lösung
Die MSMQ Dokumentation besagt, dass:
Nur die folgenden Methoden sind Thread Safe: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek und Empfangen.
MSMQ.Send () ist nicht von Natur aus Thread-sicher.
Senden ist Thread-sicher, solange Sie immer ein Objekt Nachricht senden und nie verwenden, um direkt ein .NET-Objekt senden. Mit das Message-Objekt, ist BTW, immer ein gute Idee - da es lässt Sie hinzufügen Etikett, Timeouts, erzielbare Option und all diese Sachen, die Ihr MSMQ machen Lösung eine echte Enterprise-Lösung.
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); } } }
Von: Ist Send () Thread-sicher ?