Exemplo n.º 1
0
        /// <summary>
        /// Creates a new item that provides a callback event after a frame.
        /// </summary>
        public static Item CreateFrameDelay(ItemFinishHandler finishHandler)
        {
            DelayItem item = new DelayItem(0f, 0, finishHandler);

            RegisterItem(item);
            return(item);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates a task that completes when CurrentTime >= expiryTime.
        /// </summary>
        /// <param name="expiryTime">Time at which the returned task will be completed.</param>
        /// <param name="cancelationToken">Cancellation token for the created task.</param>
        /// <returns>A task which completed at <paramref name="expiryTime"/>.</returns>
        private async Task DelayUntil(TimeSpan expiryTime, CancellationToken cancelationToken)
        {
            if (expiryTime <= _currentTime)
            {
                return;
            }

            var delayTask = new DelayItem
            {
                When   = expiryTime,
                Signal = new TaskCompletionSource <int>(cancelationToken),
            };

            var task = delayTask.Signal.Task;

            // Note: sorted list doesn't allow duplicates, so increment expiry until unique.
            while (_delayItems.ContainsKey(expiryTime))
            {
                expiryTime += TimeSpan.FromTicks(1);
            }

            _delayItems.Add(expiryTime, delayTask);

            using (cancelationToken.Register(() => CancelTask(delayTask)))
            {
                await task;
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Creates a new item that provides a delayed callback after specified duration.
        /// </summary>
        public static Item CreateDelay(float duration, int repeat, ItemFinishHandler finishHandler)
        {
            DelayItem item = new DelayItem(duration, repeat, finishHandler);

            RegisterItem(item);
            return(item);
        }
Exemplo n.º 4
0
        private void CancelTask(DelayItem delayTask)
        {
            var i = _delayItems.IndexOfValue(delayTask);

            if (i != -1)
            {
                _delayItems.RemoveAt(i);
            }

            delayTask.Signal.TrySetCanceled();
        }
Exemplo n.º 5
0
        public void Add(string name, System.Action action, float time, GameObject target = null)
        {
            DelayItem item = new DelayItem();

            item.enable = true;
            item.name   = name;
            item.action = action;
            item.time   = time;
            item.target = target;
            list.Add(item);
        }
Exemplo n.º 6
0
        public void DelayQueuePollNotReady()
        {
            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            TimeSpan  delta = new TimeSpan(1, 0, 0, 0);
            DelayItem item1 = new DelayItem(TestNow + delta);
            DelayItem item2 = new DelayItem(TestNow + delta + delta);

            target.put(item1);
            target.put(item2);
            Assert.IsNull(target.poll());
            Assert.AreEqual(2, target.Count);
        }
Exemplo n.º 7
0
        public void DelayQueueTakeInOrder()
        {
            List <DelayItem> takenItems            = new List <DelayItem>();
            SortedList <DateTime, DelayItem> items = new SortedList <DateTime, DelayItem>();

            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            List <int> offsets = new List <int>();

            offsets.Add(8);
            offsets.Add(6);
            offsets.Add(7);
            offsets.Add(5);

            foreach (int i in offsets)
            {
                DateTime  dt   = TestNow + new TimeSpan(0, 0, i);
                DelayItem item = new DelayItem(dt);
                items.Add(dt, item);
                target.put(item);
            }

            Thread thr = new Thread(() =>
            {
                while (target.Count > 0)
                {
                    takenItems.Add((DelayItem)target.take());
                }
            });

            thr.Start();

            for (int i = 0; i < 12; i++)
            {
                Thread.Sleep(1000);
                TestNow += new TimeSpan(0, 0, 1);
            }

            thr.Join();

            Assert.AreEqual(items.Count, takenItems.Count);
            Assert.AreEqual(0, target.Count);

            for (int i = 0; i < items.Count; i++)
            {
                Assert.AreSame(items[items.Keys[i]], takenItems[i]);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// 在主线程中执行的方法
        /// </summary>
        /// <param name="action"></param>
        /// <param name="delay"></param>
        public void ExecuteOnMainThread(Action action, float delay = 0)
        {
            lock (actionList)
            {
                var item = new DelayItem()
                {
                    CurrentAction = action,
                    Time          = DateTime.Now.AddSeconds(delay)
                };
                actionList.Add(item);
            }


//             if (action == null)
//             {
//                 this.action = action;
//             }
//             else
//             {
//                 this.action += action;
//             }
        }
Exemplo n.º 9
0
        public void DelayQueuePollInOrder()
        {
            List <DelayItem> takenItems            = new List <DelayItem>();
            SortedList <DateTime, DelayItem> items = new SortedList <DateTime, DelayItem>();

            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            List <int> offsets = new List <int>();

            offsets.Add(8);
            offsets.Add(6);
            offsets.Add(7);
            offsets.Add(5);

            foreach (int i in offsets)
            {
                DateTime  dt   = TestNow + new TimeSpan(0, 0, i);
                DelayItem item = new DelayItem(dt);
                items.Add(dt, item);
                target.put(item);
            }

            TestNow += new TimeSpan(0, 0, 50);
            while (target.Count > 0)
            {
                takenItems.Add((DelayItem)target.poll());
            }


            Assert.AreEqual(items.Count, takenItems.Count);
            Assert.AreEqual(0, target.Count);

            for (int i = 0; i < items.Count; i++)
            {
                Assert.AreSame(items[items.Keys[i]], takenItems[i]);
            }
        }
Exemplo n.º 10
0
        public void DelayQueuePollMultipleReady()
        {
            DelayQueue target = new DelayQueue();

            TestNow = new DateTime(2000, 1, 1);
            TimeSpan  delta    = new TimeSpan(1, 0, 0, 0);
            const int numItems = 10;

            SortedList <TimeSpan, DelayItem> items = new SortedList <TimeSpan, DelayItem>(10);

            // Put in five ready items, five not ready items
            {
                TimeSpan d2 = delta;
                for (int i = 0; i < numItems / 2; i++, d2 += delta)
                {
                    DelayItem iplus  = new DelayItem(TestNow + d2);
                    DelayItem iminus = new DelayItem(TestNow - d2);
                    target.put(iplus);
                    target.put(iminus);
                    items.Add(d2, iplus);
                    items.Add(-d2, iminus);
                }
            }

            Assert.AreEqual(numItems, target.Count);

            for (int i = 0; i < numItems / 2; i++)
            {
                object qItem = target.poll();
                object item  = items[items.Keys[0]];
                items.RemoveAt(0);
                Assert.AreSame(item, qItem);
                Assert.AreEqual(items.Count, target.Count);
            }

            Assert.IsNull(target.peek());
            Assert.IsNull(target.poll());
        }