【发布时间】:2022-02-18 02:39:57
【问题描述】:
我在vb.net(VS2017,目标.net framework 4.5)中开发了一个windows服务。
Windows 服务会自动执行 sql-server 备份(基于计时器)、删除旧备份文件、读取和写入 .ini 文件并在某些情况下发送电子邮件以及 - 诅咒 - 写入事件日志。该服务必须在 windows server 2019(标准)上运行。
一切都按预期工作 - 除了 OnShutdown() 事件的处理,这让我抓狂,因为它是一个“移动目标”。
如果服务器关闭(正常情况应该是“重启”),我想:
- 登录事件日志
- 写入 .ini
- 发送电子邮件
我的代码 zu OnShutdown():
Protected Overrides Sub OnShutdown()
cModul = "OnShutdown()"
ProtokollSchreiben("Der Server wird heruntergefahren...", Typ_Warning)
'
DebugProtokollSchreiben("Timer stoppen und anhalten...", Typ_Warning)
MyTimer.Stop()
MyTimer.Enabled = False
DebugProtokollSchreiben("Timer gestoppt und angehalten...", Typ_Warning)
DebugProtokollSchreiben("Der Server wird heruntergefahren...", Typ_Warning)
DebugProtokollSchreiben("Vor schreiben .ini...", Typ_Warning)
cIniFile.WriteInteger("WindowsService", "ServerWurdeGebooted", 1)
DebugProtokollSchreiben("Nach schreiben .ini...", Typ_Warning)
DebugProtokollSchreiben("Vor MailversandServerReboot...", Typ_Warning)
MailversandServerReboot()
cModul = "OnShutdown()"
DebugProtokollSchreiben("Nach MailversandServerReboot...", Typ_Warning)
'
MyBase.OnShutdown()' call “original event”
End Sub
注意事项:
我设置:
Me.CanShutdown = True
在设计器代码中并在事件日志中写入启动时的实际值(CanShutdown is 在运行时设置为 true)。
在 ProtokollSchreiben() 和 DebugProtokollSchreiben() 中只写入日志条目。
在 MailversandServerReboot() 中,一封电子邮件通过 SMTP 发送(这在服务的其他部分也可以正常工作)。
行为:
- 有时调用事件(OnShutdown(),有时不调用
- 如果调用它,大多数情况下,事件日志中的最后一个事件是“Vor schreiben .ini...”(= 在写入 .ini 文件之前)
- -> 在这种情况下,有时会更新 .ini(尽管下一个日志条目“Nach schreiben .ini...”不会写入事件日志),有时不会
我已经搜索了互联网并阅读了这个 SO-Links:
detect shutdown in window service
Windows Service does seem to do nothing OnShutdown()
Can a Windows Service take hours to shutdown gracefully?
据我所见,我应该有大约 20 秒的时间在 OnShutDown() 中做某事。
要编写事件日志和 .ini 不应该花费一秒钟... .
也许,发送电子邮件(在函数“MailversandServerReboot()”中)可能需要更长的时间,或者当触发 OnShutdown() 时,可能无法发送电子邮件,因为其他(需要的)服务已关闭...
但是,我不明白,有时会调用该事件,有时不会调用该事件,如果它被调用,那么大多数条目“Nach schreiben .ini ...”不会写入事件日志。
感谢您的任何提示:-)
【问题讨论】:
-
您是否尝试过实现preshutdown notifications?
-
最后一行,如所写,创建了一个无限递归,该递归将以堆栈溢出结束,这可能不是您想要的。它应该是
MyBase.OnShutdown()。 -
克雷格:谢谢你说得对(那是一个错字),但也有这个错字,应该写事件日志和.ini,不是这样的。 CoreTech:也谢谢你,不——还没有尝试过。如果我找不到其他解决方案,我会尝试。我发现了更多信息,不能保证 eventnlog 的条目可以写在 OnShutdown 中。我正在尝试实现另一个“解决方案”(直接写一个标志文件)。我会尽快发布我的发现。再次感谢你们。
标签: vb.net windows-services windows-server-2019