该进程无法访问该文件,因为该文件正由另一个进程使用

时间:2015-01-15 09:08:33

标签: c# streamwriter system.io.file

我正在尝试执行以下操作:

var path = Server.MapPath("File.js"));

// Create the file if it doesn't exist or if the application has been restarted
// and the file was created before the application restarted
if (!File.Exists(path) || ApplicationStartTime > File.GetLastWriteTimeUtc(path)) {
    var script = "...";

    using (var sw = File.CreateText(path)) {
        sw.Write(script);
    }
}

但有时会抛出以下错误:

  

该进程无法访问文件'... \ File.js',因为它正在存在   由另一个进程使用

我在这里看过类似的问题但是我的看起来与其他问题略有不同。此外,我无法复制它,直到服务器负载很重,因此我希望在上传修复程序之前确保它是正确的。

如果有人能告诉我如何解决这个问题,我会很感激。

由于

1 个答案:

答案 0 :(得分:2)

听起来两个请求同时在您的服务器上运行,并且他们都试图同时写入该文件。

您希望添加某种锁定行为,或者编写更强大的体系结构。在不了解更多关于您通过此文件编写过程实际尝试完成的具体内容的情况下,我可以建议的最好的方法是锁定。我通常不喜欢在Web服务器上这样锁定,因为它会使请求相互依赖,但这样可以解决问题。


编辑:Dirk在下面指出这可能会或可能不会真正起作用。根据您的Web服务器配置,可能无法共享静态实例,并且可能会出现相同的结果。我已经提出这个作为概念证明,但你绝对应该解决潜在的问题。


private static object lockObj = new object();

private void YourMethod()
{
    var path = Server.MapPath("File.js"));

    lock (lockObj)
    {
        // Create the file if it doesn't exist or if the application has been restarted
        // and the file was created before the application restarted
        if (!File.Exists(path) || ApplicationStartTime > File.GetLastWriteTimeUtc(path))
        {
            var script = "...";

            using (var sw = File.CreateText(path))
            {
                sw.Write(script);
            }
        }
    }
}

但是,再次,我很想重新考虑你实际上想要实现的目标。也许你可以在Application_Start方法中构建这个文件,甚至只是一个静态构造函数。为每个请求执行此操作是一种混乱的方法,可能会导致问题。特别是在负载很重的情况下,每个请求都将被强制同步运行。