Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用BlockingCollection高效地写入文件<;T>;_C#_.net_Task_Blockingcollection_Concurrent Queue - Fatal编程技术网

C# 使用BlockingCollection高效地写入文件<;T>;

C# 使用BlockingCollection高效地写入文件<;T>;,c#,.net,task,blockingcollection,concurrent-queue,C#,.net,Task,Blockingcollection,Concurrent Queue,我有一个生产者-消费者场景。生产者为生成数据,其他线程使用它。当消费者获取物品时,必须将其写入文本文件。生产者线程可以生成的数据量没有限制,所以我不能将收集标记为完成。实现消费者的最佳方法是什么?我的实施: Task.Factory.StartNew(() => { try { using (var writer = new StreamWriter(path, true)) { foreach (var line i

我有一个生产者-消费者场景。生产者为生成数据,其他线程使用它。当消费者获取物品时,必须将其写入文本文件。生产者线程可以生成的数据量没有限制,所以我不能将收集标记为完成。实现消费者的最佳方法是什么?我的实施:

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中,但每次新项目到达时,我都必须打开和关闭它。如果我预计在某些情况下会有数千项会降低性能


我已经读过描述同样问题的文章。人们建议使用它,但它是.NET 4.5的一项功能,我正在使用.NET 4。

构建一个类,该类将包装并保持StreamWriter在一定时间内保持打开状态,如果达到时间限制则关闭。在下一次写入时,如果已关闭,请再次打开它。它只是一个计时器和StreamWriter的组合。构建一个类,该类将包装并保持StreamWriter在一段时间内打开,如果达到时间限制则关闭。在下一次写入时,如果已关闭,请再次打开它。它只是计时器和StreamWriter的组合。