|
分類:[.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}");
}
}
}
|