示例#1
0
        public ModeService(ServiceCreationInfo info)
            : base("mode", info)
        {
            mCurrentMode = new Mode("<none>");
            mChangeQueue = new List<ModeChange>();
            mQueueEvent = new AsyncEvent();

            Task.Run(async () =>
            {
                while (true)
                {
                    // Retry once we have something in the queue.
                    if (mChangeQueue.Count == 0)
                    {
                        await mQueueEvent.Wait();
                        continue;
                    }

                    ModeChange change;
                    var delay = TimeSpan.Zero;

                    lock (mChangeQueue)
                    {
                        change = mChangeQueue[0];
                        delay = change.ActivationTime - DateTime.Now;
                        mQueueEvent.Reset();

                        if (delay <= TimeSpan.Zero)
                            mChangeQueue.RemoveAt(0);
                    }

                    if (delay > TimeSpan.Zero)
                    {
                        using (var delayTokenSource = new CancellationTokenSource())
                        {
                            var tasks = new Task[] { mQueueEvent.Wait(), Task.Delay(delay, delayTokenSource.Token) };
                            await Task.WhenAny(tasks);
                        }
                        continue;
                    }

                    CurrentMode = change.Mode;
                }
            });
        }
示例#2
0
        private void ChangeMode(Mode mode)
        {
            if (mCurrentMode == mode)
            {
                Log.Debug("Already in mode: {0}", mode.Name);
                return;
            }

            Log.Debug("Changing mode, old: {0}, new: {1}", mCurrentMode.Name, mode.Name);

            Mode oldMode = mCurrentMode;
            mCurrentMode = mode;

            if (OnModeChange != null)
                OnModeChange(this, new ModeEvent(mCurrentMode, oldMode));
        }
示例#3
0
 public ModeChange(Mode mode, DateTime activationTime)
 {
     this.Mode = mode;
     this.ActivationTime = activationTime;
 }
示例#4
0
        public void QueueChange(Mode mode, int seconds)
        {
            Log.Debug("Queuing mode: {0}, timeout: {1}", mode.Name, seconds);

            var activationTime = DateTime.Now + new TimeSpan(0, 0, seconds);

            lock (mChangeQueue)
            {
                mChangeQueue.Add(new ModeChange(mode, activationTime));
                mChangeQueue.OrderBy(x => x.ActivationTime);
                mQueueEvent.Set();
            }
        }