阻止收集或队列<t>作业?</t>

时间:2011-08-23 12:35:37

标签: c# .net collections jobs

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

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

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

我可以在队列中使用单个线程,只使用while(true),如果有则可以使用项目吗?

您怎么看?

2 个答案:

答案 0 :(得分:15)

如果您计划使用后台线程,那么您应该选择BlockingCollection<T>。您可以非常轻松地执行您正在寻找的相同while(true)逻辑。

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

  1. 这是线程安全的

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

答案 1 :(得分:0)

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

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