3

PeekCompleted を使用して MessageQueue からメッセージを読み込んでいます。ここでプロセスを実行し、すべてがうまくいけば、キューから削除する必要があります。現在、私は MyMessageQueue.Receive() を使用していますが、これは各メッセージが正しく処理されることを確認する信頼できる方法ですか?

    MessageQueue MyMessageQueue;
    public Form1()
    {
        InitializeComponent();

        MyMessageQueue = new MessageQueue(@".\private$\Dms");
        MyMessageQueue.PeekCompleted += new PeekCompletedEventHandler(MessageQueue_PeekCompleted);
        MyMessageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
        MyMessageQueue.BeginPeek();
    }

    void MessageQueue_PeekCompleted(object sender, PeekCompletedEventArgs e)
    {
        try
        {
            Debug.WriteLine("ToProcess:" + e.Message.Body);
            //Long process that maybe fail
            MyMessageQueue.Receive();
        }
        finally
        {
            MyMessageQueue.BeginPeek();
        }
    }
4

3 に答える 3

4

Receive()はキューの最初のメッセージを受信し、キューから削除します。必要なのはMessageQueue.ReceiveByIdメソッドです

MyMessageQueue.ReceiveById(e.Message.Id);

第二に、私はあなたが常にMessageQueue.EndPeekメソッドを呼び出す必要があると思います

Message m = MyMessageQueue.EndPeek(e.AsyncResult);
于 2012-06-29T01:22:09.863 に答える
1

これは、キューの受信者が常に1つしかない場合に機能します。別のプロセスが、BeginPeekメソッドとReceiveメソッドの間でそのメッセージをピークして受信する可能性があります。これは、上記のReceiveByIdの提案にも当てはまります。

受信者が1つだけ必要な場合は、DenySharedReceiveフラグを使用してキューを開き、これを強制できます。

于 2012-09-25T15:36:08.513 に答える
0

私はいつも同じBeginPeek()メソッドを使用しようとしています。これにより、メッセージの到着が遅れた場合でも他のジョブを処理できるようになり、完了後にピークが戻ったときにメッセージを選択できるようになります。上記では、例としてコードスニペットを示したと思います。これは、新しいメッセージチェックと、クライアントアプリの完全なtryおよびcatchブロックを実行するために、独自のクラス/メソッドを作成する必要がある場合があるためです。

于 2012-06-29T01:27:22.020 に答える