gpt4 book ai didi

c# - 使用 System.Threading.Timer 在 C# 中延迟队列

转载 作者:太空宇宙 更新时间:2023-11-03 21:51:03 24 4
gpt4 key购买 nike

我必须在 C# 中实现延迟队列,因为 C# 中没有延迟队列的标准实现。我希望使用 System.Threading.Timer 来实现节点的延迟入队。

public class DelayQueue<T>
{
private Queue queue<T> = new Queue<T>();

public void Enqueue(Object object)
{
this.queue.Enqueue(object as T);
}

public void Enqueue(T node, TimeSpan dueTime)
{
new System.Threading.Timer(this.Enqueue, node, dueTime, -1);
}

.
.
.
}

这种方法对我来说看起来不错,但由于我是 C# 的新手(来自 C 背景),我希望有人认为这是正确的方法还是有更好更有效的方法来做同样的事情?

最佳答案

我不认为为每个项目创建计时器是个好主意。无论如何,当你从队列中出列项目时,你只需要得到第一个准备好的项目,然后你就可以存储项目准备就绪的时间:

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

用法:

DelayQueue<string> queue = new DelayQueue<string>();
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));

关于c# - 使用 System.Threading.Timer 在 C# 中延迟队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14537987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com