【问题标题】:C# - BlockingCollection: Can we have 2 threads Take() the same value?C# - BlockingCollection:我们可以有 2 个线程 Take() 相同的值吗?
【发布时间】:2010-12-05 19:49:33
【问题描述】:

我一直在使用 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
}

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

【问题讨论】:

    标签: c# multithreading synchronization


    【解决方案1】:

    听起来您只想为每个线程创建一个单独的队列。以相同的顺序将相同的对象添加到每个队列中,然后每个线程可以在空闲时删除它们。

    【讨论】:

    • 这绝对是一个选择,但是,如果您正在处理非常大的文件并且您无法在内存中保留重复文件..?
    • Twodordan:如果Line 被声明为class,它将不会在内存中存储两次。它将被存储一次,其引用(32 位运行时为 4 个字节)将被存储两次。在担心内存问题之前,您可能必须排上数千个队列。
    • 你是对的。好吧,我想那解决了我的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2014-04-20
    相关资源
    最近更新 更多