質問

私は、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);
        }
    }
}

より:()はスレッドセーフに送信されています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top