小编pki*_*die的帖子

多个消费者并查询C#BlockingCollection

我使用.NET 4.0 BlockingCollection来处理一个项目队列,每个项目都需要由一个操作处理,这个操作最多可能需要一秒钟来处理每个项目.这个项目队列可以由不同的线程添加.

我有几个问题a)允许多个消费者使用这个BlockingCollection?我注意到了GetConsumingEnumerable(),它似乎适用于单个消费者场景.拥有多个消费者的原因是,通过命名管道实例的处理一次最多可以处理三个这样的项目,所以我认为我可以有三个消费者.

b)是否有办法检查项目是否在此队列中,如果是,则让调用者检查是否有项目要阻止,直到该项目被处理完毕?

编辑:

基于Jon Skeet的答案,这里有一些示例代码,用于说明多个消费者对由单个生产者填充的BlockingCollection进行操作,消费者使用GetConsumingEnumerable():

static BlockingCollection<string> coll = new BlockingCollection<string>();

static void Consume()
{
    foreach (var i in coll.GetConsumingEnumerable())
    {
        Console.WriteLine(String.Format("Thread {0} Consuming: {1}",  Thread.CurrentThread.ManagedThreadId, i));
        Thread.Sleep(1000);
    }
}

static void Main(string[] args)
{
    int item = 0;

    Task.Factory.StartNew(() =>
    {
        while (true)
        {
            coll.Add(string.Format("Item {0}", item++));
            Thread.Sleep(500);
        }
    });

    for (int i = 0; i < 2; i++)
    {
        Task.Factory.StartNew(() => Consume());
    }

    while (true) ;
}
Run Code Online (Sandbox Code Playgroud)

在两个不同线程上操作的两个消费者之间以交错的方式处理项目,例如

Thread 4 Consuming: Item 0 …
Run Code Online (Sandbox Code Playgroud)

.net c# c#-4.0

18
推荐指数
2
解决办法
8679
查看次数

标签 统计

.net ×1

c# ×1

c#-4.0 ×1