0

以下代码示例(来自此处)创建一个可等待计时器并将系统设置为休眠模式。恢复后,我期望一个带有可执行代码的事件:

class WakeUpTimer
    {
        [DllImport("kernel32.dll")]
        public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes,
                                                          bool bManualReset,
                                                        string lpTimerName);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWaitableTimer(SafeWaitHandle hTimer,
                                                    [In] ref long pDueTime,
                                                              int lPeriod,
                                                           IntPtr pfnCompletionRoutine,
                                                           IntPtr lpArgToCompletionRoutine,
                                                             bool fResume);

        public event EventHandler Woken;

        private BackgroundWorker bgWorker = new BackgroundWorker();

        public WakeUpTimer()
        {
            bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
        }

        public void SetWakeUpTime(DateTime time)
        {
            bgWorker.RunWorkerAsync(time.ToFileTime());
        }

        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (Woken != null)
            {
                Woken(this, new EventArgs());
            }
        }

        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            long waketime = (long)e.Argument;

            using (SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero, true, this.GetType().Assembly.GetName().Name.ToString() + "Timer"))
            {
                if (SetWaitableTimer(handle, ref waketime, 0, IntPtr.Zero, IntPtr.Zero, true))
                {
                    using (EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset))
                    {
                        wh.SafeWaitHandle = handle;
                        wh.WaitOne();
                    }
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
        }

    }

这个类的用法如下:

private void setHibernation(DateTime dateTime)
        {
            WakeUpTimer wakeUpTimer = new WakeUpTimer();
            wakeUpTimer.Woken += backFromHibernate;
            wakeUpTimer.SetWakeUpTime(dateTime);
            Application.SetSuspendState(PowerState.Hibernate, false, false);
            Debug.WriteLine("---Hibernation starts at " + DateTime.Now + " ---");
        }

private void backFromHibernate(object sender, EventArgs e)
{
     Debug.WriteLine("I execute this now " + DateTime.Now);
}

正如我在此场景之前多次测试的那样,方法backFromHibernation中的代码会立即执行(在setSupsendState duo 调试日志后 1 秒)。

我错了还是应该在系统从休眠状态备份时调用该方法?

会得到一些帮助,需要这样的事件 - 唤醒后自动触发。

编辑:设置休眠 2 分钟,所有工作正常的系统会自动出现。

4

0 回答 0