所以,你应该这样做:
var application = HttpContext.Current.ApplicationInstance;
application.Lock();
application["SomeVariable"] = someValue;
application.Unlock();
但是很多时候我看到遗留代码就是这样做的:
HttpContext.Current.ApplicationInstance["SomeVariable"] = someValue;
不使用Lock()
。
页面不需要锁定应用程序对象来编辑应用程序集合。如果一个页面试图在没有锁定的情况下编辑应用程序集合,而第二个页面也尝试编辑该集合,则IIS不会发送任何错误,并且Application对象最终会处于不一致状态。
这是什么意思?
这些遗留应用程序在未能锁定时如何不会爆炸?
答案 0 :(得分:2)
您正在引用ASP的古代文档。
HttpApplicationState类使用AllKeys和Count属性以及Add,Clear,Get,GetKey,Remove,RemoveAt和Set方法执行自动锁定和解锁。但是,在进行一系列操作时明确使用Lock和UnLock方法可能会更有效。
所以这只是性能优化的事情,仅此而已。 <{1}}锁定自身后,您无法以无效状态结束。
答案 1 :(得分:-1)
如果您没有锁定,则可能会遇到race condition。
即使是远程竞争条件的危险太大了。如果您运行的代码足够长或足够,那么将遇到竞争条件。这是一个ASP页面/ Web服务器,他们的共同点就是它们。 您需要意识到它们可能发生以及它们是如何发生的,或者它们将发生,您将有时间找出应用程序以某种方式运行的原因。