首页 > 解决方案 > 锁定以追加到 ASP.NET 中的文件

问题描述

以下简单的错误记录代码Global.asax看起来是线程安全的:

static object errorLogLock = new object();

protected void Application_Error()
{
    Exception ex = Server.GetLastError();

    lock (errorLogLock)
        System.IO.File.AppendAllText(errorLogPath, ex.ToString());
}

但我认为不是,因为这个问题证明了同时存在多个 IIS 进程是可能的,并且每个进程都有自己的errorLogLock.

我怎样才能使这个线程安全?或者,如何防止并发 IIS 进程?

我可以使用互斥锁,但我想知道它是否真的有必要。

(请不要告诉我有关记录错误的更好方法,我很清楚它们。也不使用FileShare.Write.)

标签: c#asp.netiisthread-safety

解决方案


简短的回答:是的,amutex是必要的。

正如您已经提到的,当您的网站在具有多个工作进程的应用程序池中运行时,您的网站可能由不同的进程运行。

然后,所需的锁定取决于您锁定的资源类型。如果资源仅在该进程中是线程安全的,则对象锁就足够了。这方面的一个例子是HttpApplicationState

然而,像文件这样的公共资源是进程外部的,并且不受进程“管理”。进程间锁定只能由mutex.


推荐阅读