2011-01-25 9 views
0

MSMQキューをポーリングし、受信メッセージをハンドラにディスパッチするWindowsサービスがあります。サービスをシャットダウンする必要があるときは、キューのReceiveを一定時間後にタイムアウトさせない限り、サービスはシャットダウンしません。私がWindowsサービスコントローラーがサービスを終了することはできません(&私もインストーラーをテストする必要があります)。実際には、キューに負荷がかかるため、これは問題にはなりません。しかし、私の開発環境では、私はイベントログに多数の偽のエラーエントリを取得します。例えば:私は受信機能の合法的な使用としてこれを見るため、WindowsイベントログのスプリアスMSMQタイムアウトエラー

while (!Signal) 
     { 
      try 
      { 
       var msg = Queue.Receive(TimeSpan.FromSeconds(1)); 
       if (Signal) 
       { 
        EventLog.WriteEntry("LoggingHub", 
         "Terminating QueueReader for Path [" + 
         Queue.Path + "]", EventLogEntryType.Information); 
        return; 
       } 
       // etc etc etc 

は私がエラー報告をオフにするための方法は、ありますか?

+0

受信時にタイムアウトを設定するのがベストプラクティスと言えます。私は無限の待ち時間が常にエラー状態にうまく反応しないことによって問題を引き起こすことを発見しました。短いタイムアウトは、受信が動作不能になる可能性のある時間を制限します。 –

答えて

0

最後に、私はBeginReceiveとEndReceiveを使用して、非同期コールバックのためにタイムアウトアプローチを断念しました。私はすぐにサービスを停止することができ、無意味な貴重なリソースを使用することを控える。

FWIW:正当な使用シナリオであるはずの@John breakwellに同意しますが、誤ったエラーでイベントログを記録すると効果的に役に立たなくなります。私は、APIの変種は、一定の時間枠(ACKなど)内のイベントを予期し、タイムアウトをプロトコルエラーとして解釈できる場合にのみ使用することを想定しています。