| 分類:[.NET 全般]
下記の環境でWindowsサービスを作りました。 VisualStudio2022 C# .NETFrameWork4.8
デバックビルドをしてできたexeを下記コマンドでサービスに登録しました。 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil.exe C:\test\sss\WindowsService1.exe
サービスの開始でログ出力されることを確認。 サービスの停止でログ出力されることを確認。 サービスの一時停止でログ出力されることを確認。 サービスの再開でログ出力されることを確認。
手順 1.サービスを手動で開始。ログが出力されることを確認 2.シャットダウンを実施 3.電源ON 4.ログイン 5.ログを確認したところ、下記の状況でした。 1.シャットダウンイベントが発生していない 2.開始イベントが発生していない 3.停止イベントが発生していない 4.サービスマネージャで確認すると、開始になっている 5.タイマーイベントは発生している
いろいろイベントが発生しないため、 問題になっているのですが 一番解決しないと困ることは、シャットダウンイベントが発生しないことです。 実はこのサービスは外部と通信する機能を持っていて シャットダウン時に、外部に対して終了を通知したいのですが これができなくて困っています。
ちなみに、開始時にスレッド(内部で無限ループ)を生成し、 シャットダウン時にはこのスレッドが強制終了されるはずで スレッド内で何か例外が発生し、シャットダウンを検知することが できないか試してみましたが、なぜか検知できませんでした。
どんな方法でも良いので何か手段はありませんでしょうか?
検証用サービスのソースは下記になります。
serviceProcessInstaller1のプロパティ Account=LocalSystem serviceInstaller1のプロパティ StartType=Automatic Service1のプロパティ CanPauseAndContinue=True CanShutdown=True
public partial class Service1 : ServiceBase { private readonly Timer _WatchTimer = new Timer();
public Service1() { InitializeComponent();
_WatchTimer.Elapsed += new ElapsedEventHandler(OnTimer); _WatchTimer.Enabled = false; _WatchTimer.AutoReset = true; _WatchTimer.Interval = 1000; _WatchTimer.Enabled = true; _WatchTimer.Stop(); }
protected override void OnContinue() { LogWrite("OnContinue"); }
protected override void OnPause() { LogWrite("OnPause"); }
protected override void OnShutdown() { LogWrite("OnShutdown"); }
protected override void OnStart(string[] args) { LogWrite("OnStart"); _WatchTimer.Start(); }
protected override void OnStop() { LogWrite("OnStop"); _WatchTimer.Stop(); }
protected void OnTimer(object sender, EventArgs e) { LogWrite("OnTimer"); }
private void LogWrite(string message) { using (StreamWriter streamWriter = new StreamWriter("C:\\test\\A.txt", true)) { streamWriter.WriteLine($"{DateTime.Now} - {message}"); } } }
|