例外的ではない条件に例外を使用するべきではないことはわかっていますが、これを実行して、自分がやりたいことが本当に悪いかどうかを確認したかったのです。
MSMQ メッセージ キューからメッセージを取得しようとするルーチンがあります。キューに利用可能なメッセージがない場合は、セカンダリ ソースをチェックして、そこで利用可能なメッセージがあるかどうかを確認します。ルーチンの例は次のとおりです。
void CheckForMessages(out Message msg, TimeSpan timeout)
{
try
{
queue.Peek(timeout);
}
catch(MessageQueueException ex)
{
if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
if (messageAvailable)
{
msg = SecondaryMessageSource();
}
}
throw;
}
msg = queue.Receive();
}
MSMQ には、キュー上のメッセージ数をチェックするメカニズムはありません。メッセージが利用可能かどうかを判断する唯一の方法は、Peek を使用することです。エラーが IOTimeout に設定された状態で MessageQueueException が発生した場合は、Peek がタイムアウトになり、キューにメッセージがありません。
このルーチンは、メッセージの取得のみを目的とするスレッドのループ内で呼び出されます。タイムアウトはミリ秒の範囲になります。コール スタックは 1 つのメソッドで構成され、スレッドはそれ以外の処理を担当しません。メソッドが常に例外をスローすることはわかっていますが、これは悪い習慣と見なされていますが、この場合、本当に悪いことなのでしょうか? もしそうなら、コードが完全に複雑になることなくこのタスクを達成する方法について誰か提案がありますか?