【发布时间】:2015-08-15 13:44:39
【问题描述】:
我有 3 个任务构成了一个管道。我希望终结器任务(管道中的最后一个)仅在达到其边界容量后才开始使用来自 buffer2 的数据。现在,它会在每件物品到达时挑选它们,我不希望这样。
static void Main(string[] args)
{
List<int> input = Enumerable.Range(0, 20).ToList();
BlockingCollection<int> buffer1 = new BlockingCollection<int>(10);
BlockingCollection<int> buffer2 = new BlockingCollection<int>(5);
Task producer = Task.Factory.StartNew(() => Producer(input, buffer1));
Task consumer = Task.Factory.StartNew(() => Consumer(buffer1, buffer2));
Task finalizer = Task.Factory.StartNew(() => Finalizer(buffer2));
Task.WaitAll(producer,consumer, finalizer);
Console.ReadLine();
}
private static void Producer(List<int> input, BlockingCollection<int> buffer1)
{
foreach (int i in input)
{
buffer1.Add(i);
}
buffer1.CompleteAdding();
}
private static void Consumer(BlockingCollection<int> buffer1, BlockingCollection<int> buffer2)
{
foreach(int i in buffer1.GetConsumingEnumerable())
{
Console.WriteLine("Consumer saw item " + i);
buffer2.Add(i);
}
buffer2.CompleteAdding();
}
private static void Finalizer(BlockingCollection<int> buffer)
{
foreach (int i in buffer.GetConsumingEnumerable())
{
// Do some work
Console.WriteLine("Finalizer saw item " + i);
System.Threading.Thread.Sleep(1000);
}
buffer.CompleteAdding();
}
如何让终结器在 buffer2 中包含 5 个项目之前停止使用这些项目?消费者也一样,只有在缓冲区 1 至少有 10 个项目时才应该开始消费。
【问题讨论】:
-
只是好奇。您是否有合法的用例表明此行为有用?
-
是的。我在磁盘上有一个巨大的 csv 文件。我想读取一大段行,然后在消费者将这些行发送到终结器之前处理这些行,终结器将这些行发送到服务器
标签: c# async-await task-parallel-library task