using System; using System.Collections.Generic; using System.Linq; public class DelayQueue { private List> items = new List>(); public void Enqueue(T item) { Enqueue(item, TimeSpan.Zero); } public void Enqueue(T item, TimeSpan delay) { items.Add(new DelayQueueItem() { Value = item, ReadyTime = DateTime.Now.Add(delay) }); } public T Dequeue() { return Dequeue(TimeSpan.Zero); } public T Dequeue(TimeSpan timeout) { DateTime startTime = DateTime.Now; do { DateTime now = DateTime.Now; var item = items.FirstOrDefault(i => i.ReadyTime <= now); if (item == null) continue; items.Remove(item); return item.Value; } while (DateTime.Now - startTime < timeout); return default(T); } public int Count { get { return items.Count; } } private class DelayQueueItem { public T Value { get; set; } public DateTime ReadyTime { get; set; } } }