2

プライベート メッセージ キューからメッセージを取得し、メッセージの内容に基づいて、メッセージごとに 1 つ以上の電子メール (通常は最大で 4 つまたは 5 つ) を送信する Windows サービス (C# 4.0) があります。

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

OnStop では、ステータスを表す静的な「inProcess」フラグを確認しています。設定されている場合は、ServiceBase.RequestAdditionalTime(120000) を呼び出しています。

2 つの問題があります。

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

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

ご協力いただきありがとうございます!

グレッグ

4

1 に答える 1

0

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

したがって、実際に行う唯一のことは、停止プロセスが遅い場合に、停止要求で SCM がエラーを出さないようにすることです。

ここで MSDN を参照してください: RequestAdditionalTime() メソッド

私が疑問に思っているのは、呼び出されOnStop()て完了フラグを設定し、このフラグが表示されると処理ループがすぐに終了するかどうかです。

コードを投稿できれば、この回答を絞り込むのに役立ちますが、質問から、呼び出しがさらに処理されるまで 2 分間待機することを期待しているのだろうかと思いますが、処理ループを停止するように何かを設定しています。そうでない場合は、回答をさらに絞り込むことができます。

待機する時間は、メールの重要性とキューにある可能性が高いメールの数、およびサービスを再起動すると中断したところから再開されるようにメールがどこかに保持されているかどうかによって異なります.

于 2011-11-16T22:07:35.000 に答える