gpt4 book ai didi

c# - 多个消费者和查询 C# BlockingCollection

转载 作者:可可西里 更新时间:2023-11-01 03:10:28 25 4
gpt4 key购买 nike

我正在使用 .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) ;
}

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

Thread 4 Consuming: Item 0
Thread 5 Consuming: Item 1
Thread 4 Consuming: Item 2
Thread 5 Consuming: Item 3
Thread 4 Consuming: Item 4

最佳答案

多个消费者可以同时调用 TakeTryTake - 每个项目只会被一个消费者消费。

不过,我相信 GetConsumingEnumerable 也会做你想做的事。我相信如果每个调用者都调用它,每个调用者都会得到一个单独的可枚举的消费,这将再次确保每个项目只被消费一次。我不确定当队列变空时会发生什么 - 我不知道 MoveNext() 然后是阻塞还是返回 false。

虽然我并没有真正理解你的第二个问题......

关于c# - 多个消费者和查询 C# BlockingCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7528173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com