私は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個以上の)メッセージが届く可能性があります。一部のメッセージで定義されたアクションに基づいて、実行中のスレッドを持つ一部のオブジェクトを削除/変更する必要があります。