我正在开发一个Windows窗体应用程序(c#),当程序运行时,它会创建对象将它们添加到列表中。我必须使用FIFO(先进先出)处理列表中的项目。我想在后台线程中执行此操作,我必须按顺序处理它们,编号1,编号2,编号3等等。一旦项目被添加到列表我想要处理它。所以我必须要检查一下这个清单。
实现这一目标的最佳方法是什么?
我知道blockingcollection做了类似的事情,等待处理之前添加一个项目。
我可以在队列中使用单个线程,只使用while(true),如果有则可以使用项目吗?
您怎么看?
答案 0 :(得分:15)
如果您计划使用后台线程,那么您应该选择BlockingCollection<T>
。您可以非常轻松地执行您正在寻找的相同while(true)
逻辑。
BlockingCollection<T>
为您提供了两项重要功能
这是线程安全的
当你打电话给Take()
时,它会为你阻止(即等到队列中的某些东西),所以你不必用ManualResetEvents
等编写任何代码,这是一个很好的简化。
答案 1 :(得分:0)
如果要阻止队列为空,请使用BlockingCollection
- 这是理想的......
如果你想要它更像队列(决定自己如何处理空)然后ConcurrentQueue
。
两者都是线程安全的,在ConcurrentQueue
中,大多数操作都是无锁实现的,因此非常快......无论是直接使用它还是作为BlockingCollection
的基本类型,例如{{1} - 你甚至可以在其上放置最大容量(可选的第二个构造函数参数)。