ASP.Net -- 监视器/锁或互斥体

4
我有一个使用ASP.net (c#)编写的应用程序,其中有一部分代码会修改全局可访问资源(例如web.config文件)。为了避免竞态条件,在修改资源时只允许一个用户进行操作,因此我需要使用监视器来锁定代码: lock(Global.globallyAccessibleStaticObject) { //..修改资源 //..保存资源 }
我对这种锁定方法感到满意,但是我想知道,如果这不够用怎么办?是否应该改用互斥量(mutex)呢?我知道互斥量适用于进程间锁定(跨多个进程和应用程序),因此速度较慢,但考虑到部署的ASP.NET页面的性质(跨多个应用程序域同时处理多个请求),这是否必要呢?
答案似乎取决于服务器端如何处理ASP页面。我已经研究过HTTP管线、应用程序域、线程池等方面,但我仍然不确定是否需要在我的同步中采用进程间锁定,还是仅使用进程内锁定对于Web应用程序就足够了?
注意:我不想陷入具体任务中,因为我希望这个问题保持通用性,因为它在许多(多线程)场景中都可能相关。此外,我知道有更多实现这些任务的方法(异步处理程序/页面、Web服务等),但我现在不关心。
2个回答

4
如果您的应用程序仅在一个AppPool中运行,那么它将在一个物理w3wp.exe进程中运行,因此监视器/锁应该足以保护共享资源。通过这种策略,您只需要在同一进程中运行的线程之间进行保护。

这是一个经典案例,应该在做出决定之前阅读其他答案(比如@patrickmcdonald的答案)。尽管这些答案相隔数年。 - Greg Vogel

3
我们在工作中遇到了这样一种情况,我们将一个IIS应用程序配置为在单个AppDomain中运行,但lock不能足以保护对资源的访问。
我们认为这种情况发生的原因是,在锁被释放之前,IIS正在回收AppDomain并启动一个新的AppDomain,因此我们会遇到冲突。
改用Mutex已经为我们解决了这个问题(目前为止)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接