/// <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); }
/// <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; } }
/// <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); }
private void CancelTask(DelayItem delayTask) { var i = _delayItems.IndexOfValue(delayTask); if (i != -1) { _delayItems.RemoveAt(i); } delayTask.Signal.TrySetCanceled(); }
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); }
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); }
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]); } }
/// <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; // } }
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]); } }
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()); }