C# - BlockingCollection:我们可以有2个线程Take()相同的值吗?

时间:2010-12-05 19:49:34

标签: c# multithreading synchronization

我一直在使用Tasks和BlockingCollections,他们做得很好。但据我了解,Take()方法删除队列中的对象。但是,如果您希望2个任务同时访问相同的值,该怎么办?

假设我正在读取一个文件,我通过blockingCollection.Add()将每一行发送到2个任务,但我希望这两个任务能够以相同的顺序获得相同的行。 (每个任务将对同一行做不同的事情)

我该怎么做呢? BlockingCollection可以这样做吗?或者我使用事件来传递值?如果是这样,请解释如何在另一个任务/线程中激活任务/线程的事件。

[编辑]如果我这样做怎么办:

while (!lineCollection.IsCompleted)
{
      Line line = lineCollection.Take();
      //do my processing
      //then I add the original line back to the collection
      lineCollection.Add(line);
      //and use a "wait one" to wait for T2 to Take this line aswell 
      //Then continue my while loop
}

不是很优雅......它也不能保证同步。

1 个答案:

答案 0 :(得分:3)

听起来你只想为每个线程分别建一个队列。以相同的顺序将相同的对象添加到每个队列,然后每个线程可以在闲暇时删除它们。