[英]Analogue of Queue.Peek() for BlockingCollection when listening to consuming IEnumerable<T>
[英]BlockingCollection or Queue<T> for jobs?
我正在开发一个Windows窗体应用程序(c#),当程序运行时,它创建对象将它们添加到列表中。 我必须使用FIFO(先进先出)处理列表中的项目。 我想在后台线程中执行此操作,我必须按顺序处理它们,编号1,编号2,编号3等等。 一旦项目被添加到列表我想要处理它。 所以我必须要检查一下这个清单。
实现这一目标的最佳方法是什么?
我知道blockingcollection做了类似的事情,它等待一个项目在处理之前添加。
我可以使用队列中的单个线程和while(true)并在有任何项目时使用项目吗?
你怎么看?
听起来你应该去BlockingCollection<T>
如果你打算使用后台线程。 您可以非常轻松地执行您正在寻找的while(true)
逻辑。
BlockingCollection<T>
为您提供了两个重要功能
它是线程安全的
当你调用Take()
,它会阻塞(即等到队列中的某些东西),所以你不必用ManualResetEvents
等编写任何代码,这是一个很好的简化。
如果你想阻塞队列是空的,那么使用BlockingCollection
- 它是理想的...如果你想要它更像Queue(决定自己如何处理空)然后ConcurrentQueue
。
两者都是线程安全的,在ConcurrentQueue
大多数操作都是无锁实现的,所以非常快......无论是直接使用它还是作为BlockingCollection
的基类型,例如BlockingCollection<string> = new BlockingCollection<string> (new ConcurrentQueue<string>)
- 你甚至可以在其上放置最大容量(构造函数的可选第二个参数)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.