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 に答える