ブロッキングコレクションから文字列を読み取り、それらをファイルに書き出すことになっているタスクがあります。問題は、ファイルの作成中に、タスクの完了後にファイルのサイズが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.
}
});
デバッガーをステップスルーすると、プログラムが正常に終了していることがわかります。未処理の例外はありません。
ここで何がうまくいかないのでしょうか?