私はWindowsサービスを利用していくつかのチュートリアルを調べていますが、それらはすべて非常に唖然としています。それらは通常、オーバーライドされたOnStartメソッドで何かを出力することを含みます。それは一度呼ばれるように聞こえます。では、継続的に実行する必要のあるコードをどこに置くのでしょうか?
3 に答える
サービス クラスのすべての On... メソッドは、できるだけ早く返される必要があります。これらは、Windows サービス コントローラーがサービスと対話するたびに呼び出され、サービス コントローラーは正常に返されるのを待ちます。コントロール パネルの [サービス] アプレットを使用してサービスを開始または停止すると、そのサービスの OnStart または OnStop に相当する値が戻るのを待っている間に表示されるプログレス バーが表示されます。
したがって、OnStart で行う一般的なことは、次の 1 つ以上です。
- サービスが実行する一定のタスクを実行する別のスレッドを開始します
- サービスが定期的に行うアクションを定期的に実行する(さまざまな) タイマーを設定し
System.Threading.Timer
ます (おそらく何らかの状態のポーリング)。 - おそらくTcpListenerまたはUdpClientを使用して、ネットワークポートで非同期にリッスンを開始します
- システムイベントにサブスクライブする
これらのいずれの場合でも、サービスのタスクは非同期で実行され、OnStart をすぐに終了します。ただし、スレッド、タイマー、TcpListener などを追跡して、OnStop (およびオプションで OnPause と OnContinue) で操作できるようにすることを忘れないでください。通常、行うべきことは、タイマーを破棄し (これ以上起動しないようにする)、ソケットまたはリスナーをシャットダウンしてから、ManualResetEvent を設定することです。実行中のすべてのスレッドは、このイベントを定期的にチェックし、通知されたら終了する必要があります。サービスを確実に正常にシャットダウンしたいが、データ損失の可能性がある場合は、妥当なタイムアウト (一般的には 30 秒) で実行中のスレッドに参加し、タイムアウトの期限が切れた後も実行中のスレッドを中止します。
2 つ以上のクラスを持つ他のプロジェクトと同じように、別のプロジェクトに配置します。
「Windows Service」プロジェクトには、サービスを開始するためのボイラープレート、サービスの一部であるタイマーなどを含める必要があります。残りを別のプロジェクトに配置すると、ビジネス ロジックをデスクトップ アプリ、Web アプリ、WCF サービスなどで後で使用できます。
Windows サービスを適切な方法で作成するために、私はTopShelfライブラリを使用します。これは IoC フレンドリーであり、Windows サービスのインフラストラクチャ コードをサービスのロジックから完全に分離することができます。サービスをコンソール アプリケーションとして実行し、運用環境で Windows サービスに変換することもできます。これは Windows サービスを作成するための "THE" 方法であり、過去を振り返ることはありません。