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 回答