我有一个生产者消费者场景。生产者为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中,但每次新项目到达时我都必须打开并关闭它。如果我在某些情况下期望成千上万的项目会降低性能。
我已阅读this post,其中描述了同样的问题。人们建议使用ActionBlock,但它是.NET 4.5的功能,我使用的是.NET 4。