c# - 锁定以追加到 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
.)
解决方案
简短的回答:是的,amutex
是必要的。
正如您已经提到的,当您的网站在具有多个工作进程的应用程序池中运行时,您的网站可能由不同的进程运行。
然后,所需的锁定取决于您锁定的资源类型。如果资源仅在该进程中是线程安全的,则对象锁就足够了。这方面的一个例子是HttpApplicationState
。
然而,像文件这样的公共资源是进程外部的,并且不受进程“管理”。进程间锁定只能由mutex
.
推荐阅读
- pytorch - 使用 CUDA 11.x 但出现错误:Unknown CUDA arch (8.6) or GPU not supported
- reactjs - 带有 Next.js 和样式化组件的本地字体
- android - 限制 Android 手机仅在 Chromecast 设备上播放 YouTube/视频的任何方式
- sql - 我应该如何创建 n 元关系?
- operating-system - 快速与慢速计算机的初始速度
- php - ApiPlatform - 创建自定义端点
- c# - 当只需要一个时,Selenium Chromedriver 正在创建多个实例
- linux - 根据部分文本删除重复行
- keyboard - imac 上的大于符号不正确
- python - pygame中的精灵矩形