61 lines
1.2 KiB
C#
61 lines
1.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
public class DelayQueue<T>
|
|
{
|
|
private List<DelayQueueItem<T>> items = new List<DelayQueueItem<T>>();
|
|
|
|
public void Enqueue(T item)
|
|
{
|
|
Enqueue(item, TimeSpan.Zero);
|
|
}
|
|
|
|
public void Enqueue(T item, TimeSpan delay)
|
|
{
|
|
items.Add(new DelayQueueItem<T>()
|
|
{
|
|
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<T>
|
|
{
|
|
public T Value { get; set; }
|
|
public DateTime ReadyTime { get; set; }
|
|
}
|
|
}
|