8

次のコード ブロックが頭を悩ませています。

using ステートメント内でロックを提供するファイルストリームを使用しているため、論理的には機能するはずです。StreamWriter を作成する行に到達すると、「ファイルは書き込み可能ではありません」と言って失敗します。

現在、私のプログラムはマルチスレッド アプリケーションです。任意のスレッドがこのファイルに書き込もうとしている可能性があります。ファイルをロックし、内容を読み取り、内容を確認し、変更を書き戻すプログラムが必要です。そのプロセス中、他のスレッドはそのファイルにアクセスできません。

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
    var sr = new StreamReader(fs);
    var str = sr.ReadToEnd();
    var strArray = str.Split(',');
    if (strArray.Any(st => st == text))
    {
        return;
    }
    sr.Close();

    var sw = new StreamWriter(fs);
    sw.Write(str + text);
    sw.Flush();
    sw.Close();
}
4

3 に答える 3

10

FileShare.Noneフラグはスレッドをキューに入れません。ファイルをロックするだけなので、例外が発生します。相互に排他的なアクセスを提供するために、書き込む前に共有オブジェクトをロックできます。

しかし、あなたはこれを「私のプログラムはマルチスレッドアプリケーションになりました。どのスレッドもこのファイルに書き込もうとしている可能性があります」と言います。さて、これらのスレッドはすべて、ファイルへの書き込みにまったく同じ方法を使用していますか?彼らがそうすると仮定しましょう、そしてこれはうまくいくはずです...

静的クラス変数を作成します...

private static object lockObject = new object();

ここで使用してください...

lock (lockObject) 
{
    using(var sw = new StreamWriter(fs))
    {
       sw.Write(str + text);
    }
}

私はスレッドについていくつかの仮定をしたので、これが機能しない場合は同期に関する情報を調べるか、私たちにいくつかの詳細情報を提供する必要があるかもしれません。

また、以前に閉じてくださいStreamReader(メソッドが以前に戻った場合)。使用後すぐに閉じるか、それでも使用してusingください。

于 2012-12-04T15:31:09.460 に答える
3

スレッド同期を試してください。このリンクから詳細を確認できます

于 2012-12-04T08:21:03.283 に答える