![]() |
1
17
如果您无需执行任何其他操作(或者更确切地说:在执行操作之前无法继续),则在可以执行操作之前阻止是一种方便。 如果您有一个要从中读取数据的非阻塞队列,而此时没有数据,则必须定期轮询它,或者等待一些信号量,直到有数据为止。如果队列阻塞,则该操作已自动完成。 类似地,如果您试图添加到一个已满的非阻塞队列,那么操作将失败,然后您必须弄清楚该怎么做。阻塞队列将一直等到有空间为止。 如果您有一些聪明的事情要做,而不是等待(例如检查另一个队列中的数据,或者将队列提升到完全异常),那么您需要非阻塞队列,但通常情况并非如此。 通常,有一种方法可以指定阻塞队列的超时。 |
![]() |
2
7
锁定的目的是锁定本身。可以从集合中读取多个线程,如果没有可用的数据,则线程将一直保持锁定状态,直到新数据到达。 此外,有了设置大小限制的能力,您可以让填充集合的生产者线程尽可能多地向其中馈送数据。当集合达到限制时,线程将锁定,直到使用者线程为数据腾出空间。 通过这种方式,您可以使用收集来限制数据的吞吐量,而不必亲自进行任何检查。您的线程只需要读写它们所能读写的内容,并且集合会根据需要保持线程工作或休眠。 |
![]() |
3
4
一旦你这样做了,你就会更容易理解它。 对于生产者-消费者,我们有两个对象,生产者和消费者。它们都共享构造时给定的队列,因此可以在队列之间进行写入。 添加生产者消费者是相当熟悉的,只是添加了一些不同的内容:
在您意识到foreach在队列完成添加之前不会停止循环之前,消费者似乎没有意义。在那之前,如果没有物品,它会重新进入睡眠状态。因为它是生产者和消费者的集合的同一个实例,所以您可以让消费者只在有实际事情要做的时候占用周期,而不必担心停止它、重新启动它等等。
所以你用这个集合把它们连接在一起。
|
![]() |
4
0
或者,AsyncEx提供AsyncCollection,它是BlockingCollection的异步版本。见 https://github.com/StephenCleary/AsyncEx/wiki/AsyncCollection |