public static void Main(string[] args) { var getNextCallTimer = new Timer { Enabled = true, Interval = 5000 }; getNextCallTimer.Elapsed += GetNextCallTimerOnElapsed; getNextCallTimer.Start(); MockAPI.RequestQueue = new Queue <WakeUpCallRequest>(); _wakeupCallList = new LinkedList <WakeUpCallRequest>(); _requestDict = new Dictionary <int, LinkedListNode <WakeUpCallRequest> >(); while (true) { Console.WriteLine("Room Number:"); int room; if (!Int32.TryParse(Console.ReadLine(), out room)) { Console.WriteLine("!!! Invalid room number, please enter an integer."); continue; } Console.WriteLine("Wake-up Time(HH:mm:ss):"); var inputTime = Console.ReadLine(); if (string.IsNullOrEmpty(inputTime)) { MockAPI.RequestQueue.Enqueue(new WakeUpCallRequest(room)); Console.WriteLine("--> Room num [{0}] Cancel wakeup call", room); } else { TimeSpan time; while (!TimeSpan.TryParse(inputTime, out time)) { Console.WriteLine("!!! Invalid wake-up time, please enter a datetime."); inputTime = Console.ReadLine(); } Console.WriteLine("--> Room num [{0}] call at: {1}", room, time); DateTime date = time < MockAPI.getCurrenTime() ? DateTime.Today.AddDays(1) : DateTime.Today; MockAPI.RequestQueue.Enqueue(new WakeUpCallRequest(room, date + time)); } } }
private static void Alarm() { if (Monitor.TryEnter(_wakeupCallList)) { try { if (_wakeupCallList.First == null) { return; } WakeUpCallRequest firstCallRequest = _wakeupCallList.First.Value; DateTime earliestCallTime = firstCallRequest.WakeUpTime.Value; if (DateTime.Today + MockAPI.getCurrenTime() >= earliestCallTime) { MockAPI.sendAlarmCall(firstCallRequest.RoomNo); RemoveFromSortedWakeUpList(firstCallRequest); } } finally { Monitor.Exit(_wakeupCallList); } } }