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?

War es hilfreich?

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 ?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top