如何优雅地处理WinForms应用程序中的休眠/睡眠模式?

17

我正在使用C#编写基于Windows窗体的.NET应用程序。

我遇到了一个问题:如果我的程序在计算机进入睡眠和/或休眠状态时正在运行(我现在不确定是哪一个状态,或者两种状态都会导致问题),当计算机再次唤醒时,程序就会停止响应。唯一的退出方法是从任务管理器中结束该进程。

因为显而易见的原因,这并不是我想要程序运行的方式。即使当它进入这些状态时,我只是关闭程序,那也是可以的,但我不确定如何做到这一点,或者是否有更加优雅的处理方式。


不确定你为什么提到了Visual Studio。问题只发生在你使用Visual Studio进行调试并且进入休眠/睡眠状态时吗?还是你已经验证它发生在关闭VS的发布版本中? - Allen Rice
1
也许这是多余的信息,但我喜欢在提问时尽可能提供我认为相关的信息。回答你的问题,它绝对会发生在没有 Visual Studio 的机器上的发布版本上。 - EatATaco
3
抱歉,我不是专业程序员,没有其他任何要求。话虽如此,我使用VS进行编程,考虑到我不知道问题的确切原因,对我来说它可能是相关信息。记住,我们提出问题是因为我们不是专家。 - EatATaco
3个回答

9
你需要:

using Microsoft.Win32;   

以下是代码:

 void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
    {
        if(e.Mode == PowerModes.Suspend)
        {
            this.GracefullyHandleSleep();
        }
    }

这是我选择的方案。

6

处理这些事件可能是一个解决方法,但在应用这种解决方法之前,我会尝试找出操作系统进入休眠状态时应用程序正在做什么。

即使应用程序正在空闲,它是否会出现挂起的情况?

应用程序是否正在进行某种低级工作(与设备驱动程序或外部硬件通信),不应中断?

应用程序是否使用某种网络连接?


它每秒轮询一次串口,并使用内置的serialport类。我的直觉告诉我,这正是导致问题的原因,因为我在VS serialport类中遇到了许多已知的错误。但即便如此,最快的解决方案仍然是关闭程序,而我们最近时间非常紧迫,所以我可能会这样做来解决所有潜在的问题。 - EatATaco
好的。当您收到休眠/睡眠/待机信号时,请尝试关闭串行端口,并在操作系统重新启动后打开它。 - Christian Schwarz

2

这篇文章介绍如何监听事件。你需要像重写WndProc并监听PBT_APMSUSPEND事件那样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接