C# 阻止收集或队列<;T>;找工作?
我正在开发一个windows窗体应用程序(c#),当程序运行时,它会创建对象并将它们添加到列表中。我必须使用FIFO(先进先出)处理列表中的项目。我想在后台线程中这样做,我必须按顺序处理它们,1号,2号,3号等等。一旦一个项目被添加到列表中,我就要处理它。所以我得查一下清单 实现这一目标的最佳方式是什么 我知道blockingcollection也做了类似的事情,它在处理之前会等待添加一个项目 我可以在队列中使用一个线程,然后在(true)的同时获取项目(如果有的话)C# 阻止收集或队列<;T>;找工作?,c#,.net,collections,jobs,C#,.net,Collections,Jobs,我正在开发一个windows窗体应用程序(c#),当程序运行时,它会创建对象并将它们添加到列表中。我必须使用FIFO(先进先出)处理列表中的项目。我想在后台线程中这样做,我必须按顺序处理它们,1号,2号,3号等等。一旦一个项目被添加到列表中,我就要处理它。所以我得查一下清单 实现这一目标的最佳方式是什么 我知道blockingcollection也做了类似的事情,它在处理之前会等待添加一个项目 我可以在队列中使用一个线程,然后在(true)的同时获取项目(如果有的话) 你觉得怎么样?如果你打算使
你觉得怎么样?如果你打算使用后台线程,听起来你应该选择。您可以非常轻松地执行所需的
while(true)
逻辑
BlockingCollection
提供了两个重要功能
如果要阻止队列是否为空,请使用
BlockingCollection
-这非常理想。。。
如果您希望它更像队列(自行决定如何处理空队列),则ConcurrentQueue
两者都是线程安全的,在
ConcurrentQueue
中,大多数操作都是以非常快的速度实现的无锁操作。。。无论是直接使用还是作为BlockingCollection
的基本类型,例如BlockingCollection=new BlockingCollection(new ConcurrentQueue)
-您甚至可以对其设置最大容量(构造函数的可选第二个参数)。完全正确!我问这个只是为了证实我的想法,如果有人有更好的想法:)@Jonathan Beerhalter:或者,他可以让他的背景线程在,当项目放置在BlockingCollection
@syncis:getconsumineGenumerable
中时,将生成项目,直到项目添加到BlockingCollection
中,就像Take
will一样;问题是,除了处理这些项目之外,你的后台线程还做了什么?如果您试图保存线程;不要,你基本上是在重新编写线程池,这通常不是一个好主意。注意,当您逐个处理项目时,可以通过获取
或通过获取
获取更多项目(也可以根据需要将这些项目发送到其他线程中进行处理)。