How to use the .NET Timer class to trigger an event at a specific time?

前端 未结 9 1691

I would like to have an event triggered in my app which runs continuously during the day at a certain time, say at 4:00pm. I thought about running the timer every second and

9条回答
  •  清歌不尽
    2020-12-01 00:47

    Taking VoteCoffees lead, here is a compact event based solution:

    public class DailyTrigger 
    {
        readonly TimeSpan triggerHour;  
    
        public DailyTrigger(int hour, int minute = 0, int second = 0)
        {
            triggerHour = new TimeSpan(hour, minute, second);
            InitiateAsync();        
        }
    
        async void InitiateAsync()
        {
            while (true)
            {
                var triggerTime = DateTime.Today + triggerHour - DateTime.Now;
                if (triggerTime < TimeSpan.Zero)
                    triggerTime = triggerTime.Add(new TimeSpan(24,0,0));
                await Task.Delay(triggerTime);
                OnTimeTriggered?.Invoke();
            }
        }
    
        public event Action OnTimeTriggered;
    }
    

    Consumer:`

    void Main()
    {
        var trigger = new DailyTrigger(16); // every day at 4:00pm
    
        trigger.OnTimeTriggered += () => 
        {
            // Whatever
        };  
    
        Console.ReadKey();
    }
    

提交回复
热议问题