2

テキスト ファイルに書き込むコードの一部があります。これは、ファイルに書き込むことになっている唯一のアクティブなプロセスであり、その方法は次のとおりです。

try
{
    File.AppendAllText(path, '\n' + tmp);
}
catch (Exception)
{
    lblError.Text = "Unable to save file";
}

これは、半分の時間のようにうまく機能します。ただし、ファイルが別のプロセスによって使用されているという例外がスローされることがあります。ファイルを使用するプロセスとそのw3wp.exe. 私はFile.AppendAllTextそれが終わったらファイルを閉じると読んだので、私がやったようにうまくいくはずです。右?

編集:

目的の説明を求められたので、ここに行きます。コードのこの部分は、別のプロセスが使用する構成テキストファイルに行を追加することになっています。そのプロセスが現在実行されていないことは 100% 確信しています。

また、これは asp.net アプリケーション (コード ビハインドから) であることも付け加えておきます。したがって、ユーザーは asp ページから config.txt に書き込むことができます。

私はこれを試しました:

static readonly object saveLock = new object();
/*
 *  stuff
 */
protected void saveToConfig(string input)
{
    lock(saveLock)
    {
        File.AppendAllText(path, '\n' + input);
    }
}

しかし、複数のプロセスがファイルにアクセスしようとしているという IOException エラーが引き続き発生します。

4

1 に答える 1

4

Palmerを使用して、失敗した場合に書き込みを繰り返すロジックを作成できます。

Retry.On<IoException>().For(TimeSpan.FromSeconds(15)).With(context =>
    {
        File.AppendAllText(path, '\n' + tmp);
    });
于 2014-07-21T07:39:59.223 に答える