プライベート ローカル メッセージ キュー (MSMQ) を処理する Windows サービスがあります。開始時にイベント ハンドラーをPeekCompleted
キューに登録し、非同期を呼び出してBeginPeek()
メッセージの到着を待機します。
protected override void OnStart(string[] args)
{
if (String.IsNullOrWhiteSpace(args[0]))
return;
queue = new MessageQueue(args[0]);
queue.Formatter = new BinaryMessageFormatter();
queue.PeekCompleted += new PeekCompletedEventHandler(OnPeekCompleted);
queue.BeginPeek();
}
メッセージが到着したら、私の目標は明らかにそのメッセージを処理することです。私のコードには現在queue.Receive()
、トランザクション内に含まれるメッセージを取得するメソッドがあり、処理中にエラーが発生した場合にメッセージがキューに戻されます。BeginPeek()
サイクルを再開するために再度呼び出されます。
private static void OnPeekCompleted(Object source, PeekCompletedEventArgs asyncResult)
{
try
{
MessageQueue q = (MessageQueue)source;
using (MessageQueueTransaction trans = new MessageQueueTransaction())
{
trans.Begin();
Message msg = q.Receive(trans);
ProcessMessage(msg);
trans.Commit();
}
// Restart the asynchronous peek operation.
q.BeginPeek();
}
catch (MessageQueueException qEx)
{
// TODO: Walk it off.
}
return;
}
いつでもEndPeek()
キューに電話する必要がありますか?
この質問が暗示しているように、おそらくメモリリークを避けるためですか?私はそうする必要はないと確信していますが、ドキュメントはそれについてあまり明確ではありません。何かを「終わらせる」ことなく「始める」のは100%正しいとは思えません:)
Receive()
ところで:行をに置き換えることもできMessage msg = q.EndPeek(asyncResult.AsyncResult)
ます。これにより、メッセージが同様にフェッチされますが、キューからメッセージが削除されません。