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()
    {
        DateTime now = DateTime.Now;
        var item = items.FirstOrDefault(i => i.ReadyTime <= now);
        if (item != null)
        {
            items.Remove(item);
            return item.Value;
        }

        return default(T);
    }

    private class DelayQueueItem<T>
    {
        public T Value { get; set; }
        public DateTime ReadyTime { get; set; }
    }
}

update

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);
}

用法:

queue.Enqueue("world", new TimeSpan(0, 0, 1));
queue.Enqueue("hello");                        
queue.Enqueue(",");

TimeSpan timeout = new TimeSpan(0, 0, 2);
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue(timeout));
Console.WriteLine(queue.Dequeue(timeout));

相关文章:

  • 2019-06-03
  • 2020-04-18
  • 2021-06-06
  • 2021-09-21
  • 2021-11-20
  • 2021-12-11
  • 2020-01-28
猜你喜欢
  • 2021-06-07
  • 2021-10-19
  • 2021-07-10
  • 2021-05-22
  • 2021-11-19
  • 2021-09-17
  • 2021-08-07
  • 2021-08-27
相关资源
相似解决方案