【发布时间】:2012-12-19 00:10:43
【问题描述】:
我经常需要处理一个项目队列,其中没有一个用户应该能够阻止队列,并且队列中的项目应该按某种顺序处理。我经常写一个类来做这件事,但我认为应该有一些通用版本但我找不到。
所以我正在寻找一个队列类,我可以在其中指定一个类型、一个分区选择器和一个排序选择器,这样我就可以将对象添加到队列中,然后当我取出对象时,我会得到由我的顺序说明符排序的下一个分区中的第一个对象。
例如,我会这样调用,指定如何分区以及如何对队列进行排序:
var queue = new RoundRobinQueue<Message>(
_ => _.UserID,
_ => _.SendDate
);
在我添加了很多消息之后,我可以Parallel.ForEach 队列中的项目并按照最早的SendDate 的顺序处理它们,以便下一个User。这样,如果一个用户很慢,他的项目不会阻塞队列,因为他只得到一个线程,但如果只有一个用户,他是唯一的分区,所以他得到所有线程。
我查看了所有内容,但在 C# 中找不到一个很好的 generic 实现。有什么想法吗?
【问题讨论】:
-
foreach 需要 IEnumerable。但是如果这个集合,一个循环队列,总是有下一个,foreach 怎么知道什么时候结束呢?您可能会通过一些计数或超时来强制打破它。但是如果使用错误,这个类的用户可能会受到伤害,甚至是你自己。例如。这个队列可以在你的代码中作为 IEnumerable 传递,并传递给一个接受任何 IEnumerable 并对其执行 foreach 的方法,哎呀!
-
为什么不是
IEnumerable的扩展方法,它返回一个迭代器?
标签: c# linq queue round-robin