如果您在更改应用程序变量之前没有锁定会发生什么?

时间:2017-03-16 10:45:42

标签: c# asp.net .net

所以,你应该这样做:

var application = HttpContext.Current.ApplicationInstance;
application.Lock();
application["SomeVariable"] = someValue;
application.Unlock();

但是很多时候我看到遗留代码就是这样做的:

HttpContext.Current.ApplicationInstance["SomeVariable"] = someValue;

不使用Lock()

根据documentation

  

页面不需要锁定应用程序对象来编辑应用程序集合。如果一个页面试图在没有锁定的情况下编辑应用程序集合,而第二个页面也尝试编辑该集合,则IIS不会发送任何错误,并且Application对象最终会处于不一致状态。

这是什么意思?

这些遗留应用程序在未能锁定时如何不会爆炸?

2 个答案:

答案 0 :(得分:2)

您正在引用ASP的古代文档。

ASP.NET documentation读取:

  

HttpApplicationState类使用AllKeys和Count属性以及Add,Clear,Get,GetKey,Remove,RemoveAt和Set方法执行自动锁定和解锁。但是,在进行一系列操作时明确使用Lock和UnLock方法可能会更有效。

所以这只是性能优化的事情,仅此而已。 <{1}}锁定自身后,您无法以无效状态结束。

答案 1 :(得分:-1)

如果您没有锁定,则可能会遇到race condition

即使是远程竞争条件的危险太大了。如果您运行的代码足够长或足够,那么遇到竞争条件。这是一个ASP页面/ Web服务器,他们的共同点就是它们。 您需要意识到它们可能发生以及它们是如何发生的,或者它们发生,您将有时间找出应用程序以某种方式运行的原因。