Rahul s menon Ответов: 1

Как вызвать system. threading. timer, когда система спит в C# winforms?


Мое требование состоит в том, чтобы очистить некоторые данные, показанные в datagird view, когда в 12 часов вечера полночь. это рабочая система, не находящаяся в состоянии приостановки (сна). Как может сработать система.Нарезание резьбы.Таймер, когда система спит?

Что я уже пробовал:

System.Threading.Timer timer;

  public void PurgeData(DateTime dt)
        {
            try
            {

                WallBoardApp.LogInfo("Purge started");
                if (WallBoardApp.Instance.ObjSettings.IsPurgeDataonMidnight)
                {
                    WallBoardApp.LogInfo("WallBoardApp.Instance.ObjSettings.IsPurgeDataonMidnight");

                    System.Threading.TimerCallback callback = new TimerCallback(ProcessTimerEvent);



                    bool is24HourTime = System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortTimePattern.Contains("H");

                    if (is24HourTime)
                    {
                        if (DateTime.Now < dt)
                        {
                            WallBoardApp.LogInfo("DateTime.Now < dt" + dt + DateTime.Now.ToLocalTime() + "24 hour format");
                            timer = new System.Threading.Timer(callback, null,
                                          (dt - DateTime.Now.ToLocalTime()),TimeSpan.FromHours(24));
                        }
                    }
                    else
                    {
                        WallBoardApp.LogInfo("DateTime.Now < dt" + dt + DateTime.Now.ToLocalTime() + "12 hour format");
                        timer = new System.Threading.Timer(callback, null,
                                      (dt - DateTime.Now.ToLocalTime()), TimeSpan.FromHours(12));

                    }

                }
            }
            catch (Exception ex)
            {
                WallBoardApp.LogException("UnityApplicationSuite", "PurgeData()", ex);
            }
        }

 private void ProcessTimerEvent(object obj)
        {
            try
            {

                WallBoardApp.LogInfo("Purge ProcessTimerEvent started");
                ClearWallboardData();
                WallBoardApp.LogInfo("Clear wallboard data");
                NetworkLost();
                WallBoardApp.LogInfo("Purge data finished");

                WallBoardApp.LogInfo("Auto restart At purge Executing.");
                if (WallBoardApp.Instance.ObjUpdate.IsDownloadComplete && WallBoardApp.Instance.ObjSettings.IsAutoUpdate && WallBoardApp.Instance.ObjSettings.IsAutoRestartAtPurge)
                {
                    WallBoardApp.LogInfo("Auto restart At purge Executed.");
                    Application.Restart();
                    Application.Exit();
                }

                PurgeData(new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59));
                WallBoardApp.LogInfo("Purge data started");

            }
            catch (Exception ex)
            {
               }
        }

В приведенном выше коде ProcessTimerEvent запускается в полночь

1 Ответов

Рейтинг:
1

OriginalGriff

Самый простой способ-использовать планировщик задач для принудительного пробуждения и запуска в полночь каждую ночь: http://www.thewindowsclub.com/wake-up-computer-from-sleep-windows[^]
Таким образом, ваше приложение даже не должно быть запущено до того, как компьютер перейдет в спящий режим - вы можете сказать ему, чтобы он проснулся в 00:00, и запустить ваше приложение.
Затем ваше приложение снова переводит его в спящий режим, когда оно закончит.