我有一个Task,它从阻塞集合中读取字符串,并且应该将它们写入文件。麻烦的是,在创建文件时,任务完成后文件的大小为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.
}
});
在调试器中单步执行,我看到程序以有序的方式终止。没有未处理的例外情况。
这里可能出现什么问题?
答案 0 :(得分:2)
您将在每次循环运行时重新创建文件。将FileMode.Create
更改为FileMode.Append
,它会保留您在其上写的先前值。
此外,使用异常来检测你应该停止是一个非常糟糕的做法,如果这是一个消费者 - 生产者解决方案,你可以通过让生产者设置线程安全标志变量信号来轻松做得更好它完成了工作,不会产生任何其他东西。