繁体   English   中英

作业的BlockingCollection或Queue <T>?

[英]BlockingCollection or Queue<T> for jobs?

我正在开发一个Windows窗体应用程序(c#),当程序运行时,它创建对象将它们添加到列表中。 我必须使用FIFO(先进先出)处理列表中的项目。 我想在后台线程中执行此操作,我必须按顺序处理它们,编号1,编号2,编号3等等。 一旦项目被添加到列表我想要处理它。 所以我必须要检查一下这个清单。

实现这一目标的最佳方法是什么?

我知道blockingcollection做了类似的事情,它等待一个项目在处理之前添加。

我可以使用队列中的单个线程和while(true)并在有任何项目时使用项目吗?

你怎么看?

听起来你应该去BlockingCollection<T>如果你打算使用后台线程。 您可以非常轻松地执行您正在寻找的while(true)逻辑。

BlockingCollection<T>为您提供了两个重要功能

  1. 它是线程安全的

  2. 当你调用Take() ,它会阻塞(即等到队列中的某些东西),所以你不必用ManualResetEvents等编写任何代码,这是一个很好的简化。

如果你想阻塞队列是空的,那么使用BlockingCollection - 它是理想的...如果你想要它更像Queue(决定自己如何处理空)然后ConcurrentQueue

两者都是线程安全的,在ConcurrentQueue大多数操作都是无锁实现的,所以非常快......无论是直接使用它还是作为BlockingCollection的基类型,例如BlockingCollection<string> = new BlockingCollection<string> (new ConcurrentQueue<string>) - 你甚至可以在其上放置最大容量(构造函数的可选第二个参数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM