常にオンになっていないWindowsサービスを使用するC#アプリケーションがあり、サービスの開始時とシャットダウン時に電子メール通知を送信できるようにしたいと考えています。メールスクリプトを書いていますが、サービスステータスの変化を検出する方法がわからないようです。
クラスを読んでいて、メソッドが必要なのかもしれないと編集:ServiceController
思いますが、まだ開始されていないサービスで使用されている例を見つけることができませんでした。WaitForStatus()
WaitForStatus()
メソッドがbusy-waitsであり、サービスの開始/停止をリッスンしながらサービスによって実行されるプログラムの残りの部分を実行する必要があるという事実のため、これは私にとってのメソッドではないと思います、誰かがマルチスレッドと組み合わせてこの方法を使用し、クリーンで効率的なソリューションを持っていない限り。
もっと:
- サービスはアプリケーションによって開始されません。アプリケーションユーザーは、管理ツールの[サービス]ウィンドウから直接サービスを開始します。
- 使用されるサービスはデフォルトのWindowsサービスではありません-このアプリケーションで使用するために設計されたカスタムサービスです
ご協力いただきありがとうございます!
PS私はC#にかなり慣れておらず、ここに行くにつれて学習していることに注意してください。
アップデート:
サービスが開始するたびにアラートメールを送信することができました。自分が持っているコード(残念ながらここに投稿できません)を読み続けると、サービスの作成に使用したクラスが拡張されていることに気付きました。クラスと、誰かがデフォルトのメソッドをオーバーライドServiceBase
するカスタムメソッドを作成したこと。OnStart()
新しいメソッドに必要なメソッド呼び出しを追加するOnStart()
と、通知が正常に送信されました。
このメソッドでも同じことを試みましたが、OnStop()
うまくいきませんでした。続行する前に、Javaでプログラミングを数年間行っており、Javaデザインに精通していることを付け加えておきます。パターン。
私がやろうとしたのは、Javaで機能するはずだったのですが、ServiceBase
クラスのメソッドを、電子メール通知を呼び出すメソッドでオーバーライドし、型OnStop()
にキャストしてから、クラスのメソッドを再度呼び出すことでした(注:保護されたメソッドであるため、できませんでした)直接呼び出される-メソッドが呼び出してから、サービスを停止するために必要なコードを続行します)。タイプにキャストすると、カスタムメソッドではなく、デフォルトのメソッドが強制的に呼び出されると思いました。MyService
ServiceBase
ServiceBase
Stop()
OnStop()
Stop()
OnStop()
ServiceBase
OnStop()
ご想像のとおり、コンピュータを強制的にシャットダウンする前に、受信トレイに10,000通弱の電子メールが正常に送信されました。
今必要なのは、オーバーライドされたOnStop()
メソッドを使用してからデフォルトのメソッドを呼び出す方法、またはこの問題の別の解決策です。ありとあらゆる助けをいただければ幸いです。本当にありがとう。
マルチスレッドソリューションをお持ちの方へ:
protected override void OnStart(string[] args) {
string subject = "Notice: Service Started";
string body = "This message is to notify you that the service " +
"has been started. This message was generated automatically.";
EmailNotification em = new EmailNotification(subject, body);
em.SendNotification();
...INITIALIZE LISTENER FOR SERVICE STOPPING HERE...
...custom stuff to be run on start...
}
Service
また、このメソッドが呼び出されるクラスを、それを呼び出して、クラスを拡張することを忘れないでServiceBase
ください。
更新2:
私が使用する提案に関して、NotifyServerStatusChange
さまざまな理由により、ソリューションがシステム機能を使用することは許可されていないことを知りました。明確にするために、純粋にC#と.NETの範囲内にあるソリューションのみが実行可能です。もう一度、あなたの助けに感謝します!