ミューテックスは、MSMQに必要?
-
22-09-2019 - |
質問
私は、MSMQを使用して1つのキューを共有する二つのアプリケーションからソースコードを閲覧しています。最初のアプリケーションは、第二のアプリケーションがキューから読み取り、別のスレッドを有しているキューに書き込むスレッドを有しています。あなたがあなた自身のキューを実装している場合は、キューにアクセスする際に通常、アプリケーションは、右、ミューテックスが必要でしょうか?しかし、私は、これらのアプリケーションのソースコード内の任意のミューテックス/クリティカルセクションを見つけることができませんでした。私はちょうど何かを見逃していましたか?それとも、それが内部的に処理されるので、MSMQは任意のミューテックスを必要としない、そのようなことはあるのでしょうか?
解決
MSMQ のドキュメントのように述べています:
のみ、次のメソッドは、スレッドです 安全:BeginPeek、BeginReceive、 EndPeek(たIAsyncResult)、 EndReceive(IAsyncResultインター)、 GetAllMessages、PEEK、および受信ます。
MSMQ.Send()での のないのを本質的にスレッドセーフではあります。
送信はあなた限り、スレッドセーフであります 常に決してMessageオブジェクトを送信しないと 直接.NETオブジェクトを送ってください。使い方 Messageオブジェクトは、ところで、常にAです 良いアイデア - それはあなたが追加することができますので、 ラベル、タイムアウト、回復可能なオプション あなたのMSMQを作成し、すべてのこのようなもの ソリューション真のエンタープライズソリューションます。
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); } } }
より:()はスレッドセーフに送信されています