使用 C# 监听系统重启/关闭事件 - 跨平台

igg*_*igg 11 c# linux windows .net-6.0

如果我们只是谈论 Windows,我可以使用Microsoft.Win32.SystemEvents.SessionEnding

有什么跨平台的东西可以使用吗?我想要一些可以在 Windows 和 Linux 上运行的东西。我将使用 .NET 6.0

ist*_*iuk 6

据我所知,在 Linux 环境中没有直接可靠的方法来确定这一点,更不用说跨平台解决方案了。您需要实现一种特定于 Linux 的方法来检测这一点。

正如 @fredrik 在评论中提到的,使用PosixSignal会让您知道您的应用程序被要求终止,但不知道为什么。不过,您可以在收到消息后检查情况,SIGTERM以确定系统是否确实正在关闭。例如,systemctl is-system-running如果是这种情况,运行将返回“停止”。

如果我们假设一个现代 Linux 桌面环境,一个更强大的替代方案可能是订阅D-bus信号PrepareForShutdown。来自systemd 文档

当系统挂起或关闭被请求并即将执行时,以及挂起/关闭完成(或失败)后,会发出PrepareForShutdown()和PrepareForSleep()信号...

Tmds.Dbus提供了一个异步 API 来监听 .net 应用程序中的该信号。您仍然需要处理这样一个事实:您将按SIGTERM顺序收到此信息和此信息。

  • 谢谢,您的回答非常广泛,让我知道要研究什么。在赏金持续期间,我会保持这个问题的开放性,如果没有人有更好的,我会把它奖励给你。 (2认同)