System.Timers 定时器未触发事件

Posted

技术标签:

【中文标题】System.Timers 定时器未触发事件【英文标题】:System.Timers Timer not firing event 【发布时间】:2013-08-31 13:11:01 【问题描述】:

当眼睛闭上一段时间后,我必须在事件上启动计时器。如果计时器到时,屏幕会关闭。如果在计时器到时之前眼睛睁开,计时器会停止并且屏幕会打开。

ComputationOfTimer();监控眼睛是否睁开/闭上。这很好,因为我在控制台中得到了正确的反馈。

            private void ComputationOfTimer()
        
            if (blink[0] == 100)        //If eye Closed detected
            
                ctrlTimerStop = 3;
                ctrlTimerStart = ctrlTimerStart - 1;
                System.Console.Write("\n\t Eyes Closed");                    
                timerStarting();
            
            else                        //If eyes are open before timer is elapsed 
           //we have to stop timer
            
                ctrlTimerStart = 5;
                ctrlTimerStop -= 1;
                //System.Console.Write("\n\t\t\t\t\t Opened");
                timerStopping();
            
        

timerStarting() 启动计时器

            public void timerStarting()
        
            if (ctrlTimerStart == 0)
            

                screenOffTimer.Interval = 3000;
                screenOffTimer.Elapsed += screenOffTimer_Tick_ScreenOff;
                screenOffTimer.AutoReset=false;

                if (!screenOffTimer.Enabled)  //Starts timer only once
                
                    screenOffTimer.Enabled = true;
                    System.Console.Write("Timer Chaloo Hai");
                
            
        

屏幕关闭和睡眠的逻辑

            void screenOffTimer_Tick_ScreenOff(object sender, EventArgs e)
        
            System.Console.Write("Eyes Closed For long time bro!");
            Beep(440, 1000); // Concert A, for 1 second
            SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);

    //as eyes are still closed send pc to Sleep start one more timer

            gotoSleepTimer.Interval = 10000;
            gotoSleepTimer.Elapsed += gotoSleepTimer_Tick_SleepOff;
            gotoSleepTimer.AutoReset = false;

            if (!gotoSleepTimer.Enabled)
            
                gotoSleepTimer.Start();
                            

        

        void gotoSleepTimer_Tick_SleepOff(object sender, EventArgs e)
        
            System.Console.Write("So rahe hain bhai ab");
            Beep(440, 2000); // Concert A, for 1 second
            System.Windows.Forms.Application.SetSuspendState(PowerState.Suspend, false, false);

        

timerStopping();如果提前睁开眼睛,则停止计时器

            public void timerStopping()     //To stop timer when Eyes Open
        
            if (ctrlTimerStop == 0)
            
                //to do timer stop logic
                if (screenOffTimer.Enabled)
                
                    screenOffTimer.Stop();
                    System.Console.Write("Timer Band Ho Gaya");
                
                //System.Windows.MessageBox.Show("Timer Stopped");
                SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);

                if (gotoSleepTimer.Enabled)
                
                    gotoSleepTimer.Stop();
                
            

        

即使经过时间,计时器也不会触发。我之前尝试过 DispatcherTimer,但那是为了更新 WPF UI,我有不同的目标。

声明部分:

System.Timers.Timer screenOffTimer = new System.Timers.Timer();
System.Timers.Timer gotoSleepTimer = new System.Timers.Timer();

【问题讨论】:

计时器很可能正在运行,但是由于未处理的异常会被它静默忽略,因此您可能在方法的某处出现异常,从而阻止它成功完成。尝试在计时器回调中添加 try/catch。 好的,我试试,谢谢。 【参考方案1】:

试试

EventTabTimer.Elapsed += new ElapsedEventHandler(gotoSleepTimer_Tick_SleepOff);

【讨论】:

感谢它现在工作了 屏幕正在关闭,但不是进入睡眠状态 屏幕不断闪烁。现在我必须完善该逻辑。再次感谢您的快速解决方案。【参考方案2】:

我在相关代码中看不到screenOffTimer.Start()。可能是这个问题

谢谢

【讨论】:

screenOffTimer.Enabled = true;screenOffTimer.Start() 一样不是吗。

以上是关于System.Timers 定时器未触发事件的主要内容,如果未能解决你的问题,请参考以下文章

System.Timers.Timer 几毫秒后第二次触发

System.Timers.Timer

C# 三个定时器区别

问题为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?...

如何防止 System.Timers.Timer 在线程池上排队执行?

C#定时器和事件