2010-02-24 3 views
2

Je consulte les codes sources de deux applications partageant une file d'attente à l'aide de MSMQ. La première application a un thread qui écrit dans la file d'attente tandis que la deuxième application a un autre thread qui lit dans la file d'attente. Ordinairement, si vous implémentez votre propre file d'attente, les applications auraient besoin d'un mutex lors de l'accès à la file d'attente, n'est-ce pas? Cependant, je n'ai pas trouvé de section mutex/critique dans les codes sources de ces applications. Ai-je manqué quelque chose? Ou MSMQ n'a-t-il pas besoin de mutex puisqu'il est géré en interne, y a-t-il une telle chose?Mutex nécessaire dans MSMQ?

Répondre

2

La documentation MSMQ stipule que:

Seules les méthodes suivantes sont fil sécurité: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek et de réception.

MSMQ.Send() est pas intrinsèquement thread-safe.

Envoyer est thread-safe, aussi longtemps que vous toujours envoyer un objet de message et ne utilisation envoyer un objet .NET directement. En utilisant l'objet Message, BTW, est toujours une bonne idée - puisqu'il vous permet d'ajouter étiquette, délais d'attente, option récupérable et tout ce qui fait de votre solution MSMQ une véritable solution d'entreprise.

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

De: Is Send() thread safe?

+0

Je ne suis pas sûr si je comprends bien votre dernière déclaration. Créez une instance distincte de la file d'attente sur chaque thread et laissez MSMQ gérer les messages provenant de différents threads - dois-je utiliser mutex pour cela? – jasonline

+0

Oui, si je crée une instance distincte de l'objet MSMQ sur chaque thread, alors je n'ai pas besoin d'utiliser un mutex non? – jasonline

+0

effectivement, après plus de creuser s'il vous plaît voir ma réponse à jour ... –