我有一个从 Web 服务获取对象的类。我对这些对象的使用不依赖于顺序,因此我并行发出我的 Web 请求并将结果添加到ConcurrentQueue
.
同时,随着请求的产生,我们可以处理响应。
因此,我希望能够在将ConcurrentQueue
我的项目添加到其中时迭代其内容。
我怎样才能让一个班级填满队列而另一个班级清空它。它几乎肯定会比填充物更快地被清空,所以我不能在没有 a 的情况下枚举它,yield
因为集合将是空的并且不会等待。
我有一个从 Web 服务获取对象的类。我对这些对象的使用不依赖于顺序,因此我并行发出我的 Web 请求并将结果添加到ConcurrentQueue
.
同时,随着请求的产生,我们可以处理响应。
因此,我希望能够在将ConcurrentQueue
我的项目添加到其中时迭代其内容。
我怎样才能让一个班级填满队列而另一个班级清空它。它几乎肯定会比填充物更快地被清空,所以我不能在没有 a 的情况下枚举它,yield
因为集合将是空的并且不会等待。
使用 aBlockingCollection
来包装ConcurrentQueue
(a 的默认后备存储BlockingCollection
是 a ConcurrentQueue
,因此您甚至不需要明确说明它。
这允许您将消费者编写为:
foreach(var item in queue.GetConsumingEnumerable())
Process(item);
您可以使用BlockingCollection
.
您可以使用AutoResetEvent
; 每当它为空时,消费者都会等待它,而生产者在添加之后设置它(或者如果更适合模式,则添加批量)。
您可以让生产者线程进行实际处理。
第一个是最直接的。第二种方法几乎是实现第一种方法的一种方式,因此不会给您带来太多好处,但是如果您出于某种原因需要从正常模式中更改某些内容,它可能会很有用。第三个要麻烦得多,但我提到它是因为如果您的最终输出以复杂的方式组合结果,它有时会变得很方便。