private void Update() { while (true) { if (Cancel.IsCancellationRequested) { break; } try { ScheduledEvent?nextEvent = null; lock (EventLock) { var evts = Events.ToList(); evts.Sort(); DateTime now = DateTime.Now; for (int i = 0; i < evts.Count; i++) { ScheduledEvent evt = evts[i]; if (evt.When < now) { break; } evts.RemoveAt(i); i--; evt.Action(Server); } if (evts.Count > 0) { nextEvent = evts.First(); } Events = evts; } var tasks = new List <Task> { Sem.WaitAsync(Cancel.Token) }; if (nextEvent != null) { TimeSpan ts = nextEvent.Value.When - DateTime.Now; if (ts < TimeSpan.Zero) { continue; } tasks.Add(Task.Delay(ts, Cancel.Token)); } Task.WhenAny(tasks).Wait(); } catch (OperationCanceledException) { return; } catch (Exception ex) { Server.Log(LogCategory.Error, "Scheduler Error", ex.ToString()); } } }