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

The process cannot access the file because it is being used by another process

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

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);
    }
}

但是偶尔会抛出以下错误:

The process cannot access the file '...\File.js' because it is being used by another process

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

如果有人能告诉我如何解决这个问题,我将不胜感激。

谢谢

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

您需要添加某种锁定行为,或者编写更健壮的体系结构。在不知道更多关于您实际尝试通过此文件写入过程完成什么的情况下,我可以建议的最好的方法是锁定。我一般不喜欢在网络服务器上这样锁定,因为它使请求相互依赖,但这可以解决问题。


编辑:德克在下面指出这可能有效也可能无效。根据您的 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 方法中构建此文件,或者甚至只是一个静态构造函数。为每个请求都这样做是一种混乱的方法,很可能会导致问题。特别是在重负载下,每个请求都将被强制同步 运行。