winforms .NET控制台应用程序-它能否检测到由于系统关闭而导致的自身即将终止?

ht4b089n  于 2023-01-26  发布在  .NET
关注(0)|答案(1)|浏览(134)

我有一个小型控制台应用程序,它在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");
}

当然,我搜索了,我找到了Microsoft.Win32.SystemEvents类的引用,它有SessionEnding的事件,尽管it looks as if I'd need to generate a hidden form in order to be notified of that event(啊)。
这是我需要前进的方向吗?而且,控制台应用是否有可能及时检测到自己的终止以做出响应?

jjhzyzn0

jjhzyzn01#

我找到了Microsoft.Win32.SystemEvents类的引用,该类包含SessionEnding事件,但看起来好像需要生成隐藏窗体才能收到该事件的通知
更具体地说,您需要一个消息泵来接收来自操作系统的WM_ENDSESSION消息。您可以根据自己的意愿来执行此操作,无论是使用带有托管API的隐藏表单,还是在使用本机API手动创建的窗口上手动调用GetMessage/DispatchMessage
控制台应用程序是否有可能及时检测到自己终止以做出响应?
shutdown的工作原理是,当你收到上面的消息后,在你处理它的过程中(直接或通过SessionEnding事件处理程序),系统会等待你,并最终显示"programs still need to close"消息,用户可以选择是否允许更长的时间,除非它是一个关键的关机,在这种情况下,你只能得到一个很短的时间窗口。
所以是的,你应该有足够的时间来做任何理智的关闭,甚至包括注册重新启动您的应用程序时,Windows再次启动。

相关问题