我有一个小的控制台应用程序,连续运行在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再次启动时注册重新启动应用程序。