C# 阻止收集或队列<;T>;找工作?

C# 阻止收集或队列<;T>;找工作?,c#,.net,collections,jobs,C#,.net,Collections,Jobs,我正在开发一个windows窗体应用程序(c#),当程序运行时,它会创建对象并将它们添加到列表中。我必须使用FIFO(先进先出)处理列表中的项目。我想在后台线程中这样做,我必须按顺序处理它们,1号,2号,3号等等。一旦一个项目被添加到列表中,我就要处理它。所以我得查一下清单 实现这一目标的最佳方式是什么 我知道blockingcollection也做了类似的事情,它在处理之前会等待添加一个项目 我可以在队列中使用一个线程,然后在(true)的同时获取项目(如果有的话) 你觉得怎么样?如果你打算使

我正在开发一个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一样;问题是,除了处理这些项目之外,你的后台线程还做了什么?如果您试图保存线程;不要,你基本上是在重新编写线程池,这通常不是一个好主意。注意,当您逐个处理项目时,可以通过
    获取
    或通过
    获取
    获取更多项目(也可以根据需要将这些项目发送到其他线程中进行处理)。