因为它正由另一个进程的进程无法访问该文件(The process cannot access the

2019-10-21 14:43发布

我试图做到以下几点:

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',因为它正由另一个进程使用

我在这里看着的不过雷似乎从别人略有不同的类似的问题。 此外,直到服务器负载过大,因此我想确保我上传之前修复它是正确的,我不能复制它。

我会很感激,如果有人可以告诉我怎么解决这个问题。

谢谢

Answer 1:

这听起来像两个请求在同一时间在服务器上运行,而且他们都试图在同一时间写入该文件。

你会想在某种锁定行为的增加,或者写一个更强大的体系结构。 不知道更多有关具体是什么,你实际上是在试图用此文件写入程序来完成,我建议最好是锁定。 我通常不喜欢锁定这样的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方法,甚至只是一个静态构造函数。 这样做是为了每一个请求是一个混乱的方法,将有可能造成问题。 特别是在重负载,其中每个请求将被迫同步运行。



文章来源: The process cannot access the file because it is being used by another process