我有一个生产者消费者场景。生产者为BlockingCollection生成数据,其他一些线程使用它。当消费者拿走一个项目时,它必须将它写入一个文本文件。生产者线程可以生成多少数据没有限制,因此我无法将收集标记为完整。实现消费者的最佳方法是什么?我的实现:
Task.Factory.StartNew(() =>
{
try
{
using (var writer = new StreamWriter(path, true))
{
foreach (var line in _collection.GetConsumingEnumerable(token))
{
writer.WriteLine(line);
}
}
}
}, token);
这样做的问题是,即使我的集合中没有任何内容,我也会保持 StreamWriter 处于打开状态。我可以将 StreamWriter 放在 ForEach 中,但是每次有新项目到达时我都必须打开和关闭它。如果我期望在某些情况下会有数千个项目会降低性能。
我读过这篇描述同样问题的帖子。人们建议使用ActionBlock,但它是 .NET 4.5 的功能,而我使用的是 .NET 4。