.NET控制台应用程序-它可以检测到自己即将终止由于系统关闭?



我有一个小的控制台应用程序,连续运行在Azure Windows 10虚拟机,做一些计算。

但是我想如果作业可以检测到虚拟机何时即将重新启动,或者当它本身即将终止时,并写一些东西到ApplicationInsights.

在Windows 10下运行的。net控制台应用程序能否及时检测到自己的终止(由于系统关闭或其他原因)以编写一些遥测?

我已经设置了以下事件(显示了一个处理程序的示例),但是它们似乎从未产生任何遥测,这使我认为有一些东西我没有"得到"。关于政府关门是如何发生的。也许没有时间发送遥测数据了。

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
Process.GetCurrentProcess().Exited += Program_Exited;
}
private static void Program_Exited(object? sender, EventArgs e)
{
telemetryClient?.TrackEvent("ProgramEnding");
}

当然,我搜索了一下。我找到了微软win32的参考资料。SystemEvents类,它具有SessionEnding的事件,尽管看起来好像我需要生成一个隐藏表单才能收到该事件的通知(ugh)。

这是我要去的方向吗?并且,主机应用程序是否有可能及时检测到自己的终止以做出响应?

我找到了Microsoft.Win32的参考。SystemEvents类,它具有SessionEnding的事件,尽管看起来好像我需要生成一个隐藏表单才能收到该事件的通知

更具体地说,您需要一个消息泵来接收来自操作系统的WM_ENDSESSION消息。你可以这样做,无论是通过使用托管API的隐藏表单,还是通过手动调用GetMessage/DispatchMessage在您手动创建的窗口上使用本机API。

控制台应用程序是否有可能及时检测到自己的终止以响应?

关闭的工作方式是,您获得上述消息,当您处理它时(直接或通过SessionEnding事件处理程序),系统将等待您,并最终显示"程序仍然需要关闭"。消息,用户可以选择是否允许更多的时间。除非是紧急关机,在这种情况下你只有很短的时间窗口。

所以,是的,你应该有足够的时间来做任何正常的关闭,甚至包括在Windows再次启动时注册重新启动应用程序。

相关内容

  • 没有找到相关文章

最新更新