Пример #1
0
        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());
                }
            }
        }