【问题标题】:Generic c# Round Robin (partitioned/sorted) Queue通用 c# 循环(分区/排序)队列
【发布时间】: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


【解决方案1】:

查看System.Collections.Concurrent 中定义的类。有一个通用的 ConcurrentQueue 以及更多用于生产者-消费者模式的基本构建块。

MSDN总结了可用的类和接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多