1

我有一个从阻塞集合中读取字符串的任务,并且应该将它们写到文件中。麻烦的是,在创建文件时,任务完成后文件的大小为 0 字节。

在调试时,我看到从阻塞集合中检索到非空行,并且流编写器被包装在using块中。

为了调试,我投入了一个不需要的冲洗并将这些行写入控制台。从阻塞集合中读取了 100 行非空文本。

// Stuff is placed in writeQueue from a different task  
BlockingCollection<string> writeQueue = new BlockingCollection<string>();

Task writer = Task.Factory.StartNew(() => 
{
    try
    {
        while (true)
        {
            using (FileStream fsOut = new FileStream(destinationPath, FileMode.Create, FileAccess.Write))
            using (BufferedStream bsOut = new BufferedStream(fsOut))
            using (StreamWriter sw = new StreamWriter(bsOut))
            {
                string line = writeQueue.Take();
                Console.WriteLine(line); // Stuff is written to the console
                sw.WriteLine(line);
                sw.Flush(); // Just in case, makes no difference
            }
        }
    }
    catch (InvalidOperationException)
    {
        // We're done.
    }
});

在调试器中单步执行,我看到程序以有序的方式终止。没有未处理的异常。

这里可能出了什么问题?

4

1 回答 1

2

您在每次循环运行时重新创建文件。更改FileMode.CreateFileMode.Append,它将保留您之前在其上写入的值。

此外,使用异常来检测你应该停止是一个非常糟糕的做法,如果这是一个消费者-生产者解决方案,你可以通过让生产者设置一个线程安全标志变量来表明它已经完成工作并且不会产生任何东西来轻松做得更好别的。

于 2012-10-12T06:15:30.143 回答