3

動作しているこのコードを書きましたが、MSMQ をどのように使用すればよいかを考え始めました: メッセージ キューを取得するために "using" ステートメントを使用する必要がありますか? Using ステートメントは、キューを使い終わったときにキューを取り除く処理を行いますが、いつキューを使い終わるのでしょうか? 再利用のために MessageQueue オブジェクトを保存する必要がありますか? これが ASP.Net アプリケーションにあり、同じアクションから同じキューに 3 つのメッセージを送信したいとします。オブジェクトを保存して、今の私と同じように再利用するか、作成して破棄しますか?

using (MessageQueue msgQueue = new MessageQueue(this.queueName))
{
    using (MessageQueueTransaction msgTx = new MessageQueueTransaction())
    {                      
        Message recoverableMessage = null;
        msgTx.Begin();
        try
        {
            recoverableMessage = new Message();
            recoverableMessage.Body = message;
            recoverableMessage.Formatter = new BinaryMessageFormatter(System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, System.Runtime.Serialization.Formatters.FormatterTypeStyle.TypesAlways);
            recoverableMessage.Recoverable = true;

            msgQueue.Send(recoverableMessage, msgTx);
            ////this.msgQ.Send(recoverableMessage, msgTx); //whats up here??? this will teach me for taking time off. not sure whuc I shuold use
            msgTx.Commit();
            result = recoverableMessage.Id;
            //recoverableMessage.Dispose();
        }
        catch (Exception)
        {
            msgTx.Abort();
            ////recoverableMessage.Dispose();
        }
        finally
        {
            if (recoverableMessage != null)
            {
                recoverableMessage.Dispose();
            }
        }
    }
}
4

1 に答える 1

5

一般に、オブジェクトの存続期間はできるだけ短くする必要があります。これは、.NET ガベージ コレクターがこれらのオブジェクトをジェネレーション 0 からジェネレーション 1 などに移動するのを防ぐためです。これにより、メモリ消費とガベージ コレクションの数を減らすことができます。

そうは言っても、メッセージ キュー オブジェクトを維持する唯一の理由は、単一のトランザクションまたはスコープの一部として複数のメッセージを同じキューにポストすることです。

1 回のページ要求で 3 つのメッセージが送信される場合は、メッセージ キューの新しいインスタンスを作成し、メッセージを送信して、ページがレンダリングされるたびにキューを破棄します。

EDIT
スレッドのsatefyなどの詳細については、ドキュメントを参照してください。
たとえば、MSDNは、GetAllMessagesメソッドのみがスレッド セーフであると述べています。次に、API の残りの部分はスレッド セーフではないと仮定します。ただし、これは、MessageQueueオブジェクトの 1 つのインスタンスに複数のスレッドが同時にアクセスしてはならないことを意味するだけです。MessageQueue同じキューを指す複数のインスタンスを作成できます。

パフォーマンスに関しては、時期尚早に最適化しようとしている可能性があると思います。ソフトウェア (リリース ビルドのみ) のプロファイリングを行い、ある程度の負荷をかけることをお勧めします。それが信頼できる答えを得る唯一の方法です。

于 2012-06-12T10:15:15.730 に答える