使用BlockingCollection <t>进行高效的文件写入

时间:2017-05-15 12:23:05

标签: c# .net task blockingcollection concurrent-queue

我有一个生产者消费者场景。生产者为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。

0 个答案:

没有答案