2011-11-16 39 views
2

メッセージをプライベートメッセージキューから取り出し、メッセージごとに1つまたは複数の電子メール(通常は最大で4または5)をメッセージコンテンツに基づいて送信するWindowsサービス(C#4.0)があります。シングルスレッドWindowsサービスの遅延OnStop

メッセージ量が少ないので、複雑さを避けてサービスを残しましたが、電子メールは重要なので、SCM停止コマンドでは、処理中のメッセージ/電子メールが処理/送信されるようにする必要があります。停止が完了しました。

OnStopではステータスを表す静的な "inProcess"フラグをチェックしており、設定されている場合はServiceBase.RequestAdditionalTime(120000)を呼び出しています。

2つの問題があります。

  1. 停止コマンドは、2分の要求にもかかわらず、未送信の一部の電子メールですぐに完了しますが。
  2. うまくいきましたが、私はどれくらい待つべきかを推測しています。

シングルスレッドサービスでこれを処理する最も良い方法は何ですか?

ありがとうございました!

グレッグ

+0

OK、丸ごとの答えは実際には以下のように非常に単純でした。最後のメッセージOnStopの完了を強制するのではなく、単にQueue.EndPeek()を実行してから、現在のメッセージをキューに戻します。それは再び開始されます。時には明白な私たちをエスケープする.... – Serexx

答えて

0

完全に答えるために、我々はあなたのメッセージ処理ループの構造を確認する必要があると思います。しかし、私が考えていることの1つは、停止コマンド(または一時停止、継続、開始)が長すぎる場合、サービスが停止するまで2分待つことを意味しない場合、SCMが不平を言うのを防ぐためにServiceBase.RequestAdditionalTime()メソッドが使用されるということです。

したがって、スロー・ストップ・プロセスがある場合、SCMは停止要求時にエラーを出さないようにします。

はここにMSDNを参照してください:あなたはOnStop()に呼び出されると、あなたには、いくつかの完全なフラグを設定した場合、私は思ったんだけど何RequestAdditionalTime() method

があり、そしてそれは、このフラグを見たときに処理ループはただちに終了しますか?

あなたのコードを投稿すれば、私はこの答えを洗練させるのに役立ちますが、質問から、2分待って呼び出しを待つかどうか疑問に思っていますが、ループを停止します。これが当てはまらない場合は、私はさらに答えを洗練することができます。

電子メールの重要度とキュー内に存在する可能性のある数に依存し、サービスの再開が中断した場所でサービスが再開されるように、どこでも保持されます。

+0

RequestMoreTime()を明確にしてくれてありがとう - 私は古いヌードルを使用していなかった - もちろん、ここにはただ1つのスレッドがあるので、RequestMoreTime() 。上記の私のコメントを参照しても、メッセージを持続するあなたのコメントはトリックでした。ありがとう! – Serexx

+0

@Serexx:私は助けてよかった!私たちは時々古いヌードルの経過によって噛まれました:-) –

関連する問題