我刚读了一篇文章,描述了HttpApplicationState如何使用AcquireRead() / AcquireWrite()
函数来管理并发访问。它继续解释,在某些情况下,我们需要在Application对象上使用explict Lock()
和Unlock()
来避免Race条件。
如果对象隐式处理并发访问,我无法理解为什么应用程序状态应该存在竞争条件。
有人可以向我解释一下吗?为什么我需要使用Application.Lock()
和Application.Unlock()
?谢谢!
答案 0 :(得分:3)
AcquireRead和AcquireWrite方法位于内部HttpApplicationStateLock类中,因此您不必自己使用它们。它们同步访问,但仅适用于单个读取或写入。如果需要同步访问,请从代码中使用“锁定”和“解锁”方法。
如果要更改不是单个读取或写入的内容,通常需要同步访问权限,例如添加两个相互依赖的应用程序项,或首先检查项目是否存在然后添加它:
Application.Lock()
if (Application["info"] == null) {
Application.Add("info", FetchInfoFromDatabase());
}
Application.Unlock();
答案 1 :(得分:1)
HttpApplicationState - 全局访问变量,其中所有
都可见正在使用该应用程序的用户。所以为了在改变时避免竞争条件
变量的值。我们需要一些预防措施,这就是我们使用
的原因Application.Lock()并在完成作业后将相同的变量释放给
中的其他变量队列使用Application.Unlock()
Application.Lock()
Application("VisitorCount") = Convert.ToInt32(Application("VisitorCount")) + 1
Application.UnLock()