C#-BlockingCollection:我们可以让两个线程取相同的值吗?

C#-BlockingCollection:我们可以让两个线程取相同的值吗?,c#,multithreading,synchronization,C#,Multithreading,Synchronization,我一直在使用Tasks和BlockingCollection,它们做得很好。但据我所知,Take()方法会删除队列中的对象。但是,如果您希望两个任务同时访问相同的值,该怎么办 假设我正在读取一个文件,我通过blockingCollection.Add()将每一行发送到两个任务,但我希望两个任务的行数和顺序相同。(每个任务将对同一行执行不同的操作) 我该怎么做呢?BlockingCollection可以做到这一点吗?还是使用事件传递值?如果是这样,请解释如何使一个任务/线程的事件在另一个任务/线程

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

假设我正在读取一个文件,我通过blockingCollection.Add()将每一行发送到两个任务,但我希望两个任务的行数和顺序相同。(每个任务将对同一行执行不同的操作)

我该怎么做呢?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
}

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

听起来您只是希望每个线程都有一个单独的队列。将相同的对象以相同的顺序添加到每个队列中,然后每个线程都可以随意删除它们。

这当然是一个选项,但是,如果您处理的文件非常大,并且无法在内存中保留重复的文件,该怎么办呢,它不会在内存中存储两次。它将存储一次,其引用(32位运行时为4字节)将存储两次。在担心内存问题之前,你可能需要排上数千个队列。你说得对。我想这就解决了我的问题。谢谢