我试图在 .NET 4 上新的并行堆栈的上下文中理解 BlockingCollection 的用途。
The MSDN http://msdn.microsoft.com/en-us/library/dd267312(VS.100).aspx文档说:
BlockingCollection 用作 IProducerConsumerCollection 实例的包装器,允许从集合中进行删除尝试,直到可以删除数据为止。类似地,可以创建 BlockingCollection 以强制 IProducerConsumerCollection 中允许的数据元素数量的上限;然后,对集合的添加尝试可能会被阻止,直到有空间可用于存储添加的项目。
然而,当我查看某些 IProducerConsumerCollection(例如 ConcurrentQueue)的实现时,我发现它们提供了无锁、线程安全的实现。那么为什么需要BlockingCollection提供的锁机制呢? MSDN中的所有示例都显示通过BlockingCollection包装器使用这些集合,直接使用这些集合有什么麻烦?使用 BlockingCollection 会产生什么好处?
如果您无事可做(或者更确切地说:在执行操作之前无法继续),则阻塞直到可以执行操作是很方便的。
如果您有一个非阻塞队列要从中读取数据,并且当前没有数据,则必须定期轮询它,或者等待某个信号量,直到有数据为止。如果队列阻塞,这已经自动完成。
同样,如果您尝试添加到已满的非阻塞队列中,操作就会失败,然后您必须弄清楚该怎么做。阻塞队列只会等待,直到有空间。
如果您有一些聪明的做法而不是等待(例如检查另一个队列的数据,或引发 QueueTooFullException),那么您需要非阻塞队列,但通常情况并非如此。
通常,有一种方法可以指定阻塞队列的超时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)