2

我有一个从 Web 服务获取对象的类。我对这些对象的使用不依赖于顺序,因此我并行发出我的 Web 请求并将结果添加到ConcurrentQueue.

同时,随着请求的产生,我们可以处理响应。

因此,我希望能够在将ConcurrentQueue我的项目添加到其中时迭代其内容。

我怎样才能让一个班级填满队列而另一个班级清空它。它几乎肯定会比填充物更快地被清空,所以我不能在没有 a 的情况下枚举它,yield因为集合将是空的并且不会等待。

4

2 回答 2

4

使用 aBlockingCollection来包装ConcurrentQueue(a 的默认后备存储BlockingCollection是 a ConcurrentQueue,因此您甚至不需要明确说明它。

这允许您将消费者编写为:

foreach(var item in queue.GetConsumingEnumerable())
    Process(item);
于 2014-02-03T21:55:16.600 回答
2
  1. 您可以使用BlockingCollection.

  2. 您可以使用AutoResetEvent; 每当它为空时,消费者都会等待它,而生产者在添加之后设置它(或者如果更适合模式,则添加批量)。

  3. 您可以让生产者线程进行实际处理。

第一个是最直接的。第二种方法几乎是实现第一种方法的一种方式,因此不会给您带来太多好处,但是如果您出于某种原因需要从正常模式中更改某些内容,它可能会很有用。第三个要麻烦得多,但我提到它是因为如果您的最终输出以复杂的方式组合结果,它有时会变得很方便。

于 2014-02-03T22:12:57.117 回答