4

私はMSMQと.NETのスレッド化の両方に比較的慣れていません。TCPとSNMPを介して、さまざまなスレッドでリッスンするサービスを作成する必要があります。いくつかのネットワークデバイスとこれらすべてが専用スレッドで実行されますが、別のアプリケーションからMSMQキューでリッスンする必要もあります。私は別の同様のプロジェクトを分析しており、次のロジックが使用されています。

private void MSMQRetrievalProc()
{
    try
    {
        Message mes;
        WaitHandle[] handles = new WaitHandle[1] { exitEvent };
        while (!exitEvent.WaitOne(0, false))
        {
            try
            {
                mes = MyQueue.Receive(new TimeSpan(0, 0, 1));
                HandleMessage(mes);
            }
            catch (MessageQueueException)
            {
            }
        }
    }
    catch (Exception Ex)
    {
        //Handle Ex
    }
}

MSMQRetrievalThread = new Thread(MSMQRetrievalProc);
MSMQRetrievalThread.Start();

しかし、別のサービス(メッセージディスパッチャー)では、 MSDNの例に基づいて非同期メッセージの読み取りを使用しました:

public RootClass() //constructor of Main Class
{
    MyQ = CreateQ(@".\Private$\MyQ"); //Get or create MSMQ Queue

    // Add an event handler for the ReceiveCompleted event.
    MyQ.ReceiveCompleted += new
ReceiveCompletedEventHandler(MsgReceiveCompleted);
    // Begin the asynchronous receive operation.
    MyQ.BeginReceive();
}

private void MsgReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
{

    try
    {
        // Connect to the queue.
        MessageQueue mq = (MessageQueue)source;
        // End the asynchronous Receive operation.
        Message m = mq.EndReceive(asyncResult.AsyncResult);

        // Process received message

        // Restart the asynchronous Receive operation.
        mq.BeginReceive();
    }
    catch (MessageQueueException Ex)
    {
        // Handle sources of MessageQueueException.
    }
    return;
}

非同期処理では、すべてのメッセージがメインスレッド以外で処理されると想定していますか?この(2番目の)アプローチを別のスレッドに入れることができ、必要ですか?

より良いアプローチまたはいくつかの簡単な代替案をアドバイスしてください。

キューに到着するメッセージには、ルールで定義された動作はありません。長い間、いやなメッセージが届かないか、1秒以内に多くの(最大10個以上の)メッセージが届く可能性があります。一部のメッセージで定義されたアクションに基づいて、実行中のスレッドを持つ一部のオブジェクトを削除/変更する必要があります。

4

1 に答える 1

1

MSMQ には WCF を使用することを強くお勧めします。

http://msdn.microsoft.com/en-us/library/ms789048.aspx

これにより、スロットリング、キャッピング、再試行などを可能にする WCF スレッド モデルを使用して、両方の着信呼び出しを非同期に処理できます。

于 2012-09-22T00:20:52.647 に答える