2

私はC#を使用しています。私の問題を説明するために、WinForms デスクトップ アプリケーションで 2 つのタイマーに単純化しました。

最初のタイマーは、既存のテキスト ファイルをランダムに選択し、追加するためにそれを開き、その末尾に文字列を書き込みます。その後、閉じられます。
このプロセスは、数ミリ秒 (程度) ごとに繰り返し呼び出されます。

もう 1 つのタイマーもランダムにファイルを選択し、それを読み取ろうとします。このプロセスもミリ秒ごとに繰り返し呼び出されます。

最終的に、同じファイルが両方のタイマーによってアドレス指定され、ロック エラーが発生します。

次のコード行を使用してファイルに追加します。

        using (FileStream stream = new FileStream(_folder + "\\manifest.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
        {
            TextWriter newWriter = new StreamWriter(stream);
            newWriter.WriteLine(_timestamp);
            newWriter.Flush();
            newWriter.Close();
        }

そして、次のコード行を使用してファイルを読み取ります。

        using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan))
        using (var sr = new StreamReader(fs, Encoding.UTF8))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                yield return line;
            }
        }

共有アクセスの問題は、「追加」を使用すると機能しないように見えることです。
ファイルをロックする際の問題は、ランダムに選択されるため、どのファイルがロックされるかを事前に知る方法がないことです。

このためにコードを再設計する前に、これを解決する方法について誰かが賢いアイデアを持っているかどうかを確認したいと思いました。

ありがとう

4

1 に答える 1