public bool StopEvent(uint eventId) { if (eventId == 0) { return(false); } lock (EventLock) { return(ActiveEventIds.Remove(eventId)); } }
public void Shutdown() { lock (EventLock) { State = DispatcherState.Terminated; EventList.Clear(); ActiveEventIds.Clear(); Monitor.Pulse(EventLock); } }
protected void SchedulerThread() { while (State != DispatcherState.Terminated) { bool isEarlyWakening = true; Monitor.Enter(EventLock); if (EventList.Count == 0) { Monitor.Wait(EventLock); } else { int waitTime = EventList.Min.GetCycle(); if (waitTime > 0) { isEarlyWakening = Monitor.Wait(EventLock, waitTime); } else { isEarlyWakening = false; } } if (!isEarlyWakening && State != DispatcherState.Terminated) { SchedulerTask task = EventList.Min; // Get task with lowest expiration value EventList.Remove(task); if (!ActiveEventIds.Remove(task.TaskId)) // Is task still active { Monitor.Exit(EventLock); continue; } Monitor.Exit(EventLock); task.SetNotToExpire(); DispatcherManager.GameDispatcher.AddTask(task, true); } else { Monitor.Exit(EventLock); } } }
public uint AddEvent(SchedulerTask task) { lock (EventLock) { bool needSignal; if (State == DispatcherState.Running) { needSignal = EventList.Count == 0; // check if the event has a valid id if (task.TaskId == 0) { // if not generate one if (++LastEventId == 0) { LastEventId = 1; } task.TaskId = LastEventId; } // insert the event id in the list of active events ActiveEventIds.Add(LastEventId); // add the event to the queue EventList.Add(task); } else { return(0); } if (needSignal) { Monitor.Pulse(EventLock); } } return(task.TaskId); }