在我的asp.net
应用程序中,我想在HttpApplicationState
中缓存一些数据。
我设置数据的代码如下所示:
Application.Lock();
Application.Set("Name", "Value");
Application.UnLock();
当我阅读文档时,它说HttpApplicationState
是隐式线程安全的。但是在许多博客上写道,我们应该在向Application.Lock()
写入数据时使用Application.Unlock()
和HttpApplicationState
。
另一方面,我找不到任何文档说明我们应该在从HttpApplicationState
读取数据或清除时使用锁定(使用Application.RemoveAll()
)方法。
我的问题是:
RemoveAll
时,我们不应该关注线程安全吗?在我的应用程序中,一个线程可能正在从HttpApplicationState
读取数据,而其他线程可能会调用RemoveAll
。 HttpApplicationState
时,读取是否也不是线程安全的?答案 0 :(得分:3)
如果您针对应用程序状态执行多个操作,则只需要锁定。在你的情况下,你只是做一个操作,所以没有锁定它是完全安全的:
Application.Set("Name", "Value");
如果您执行多项操作,并且彼此依赖,则需要锁定。例如:
Application.Lock();
string name = Application.Get("Name");
if (name == null) {
Application.Set("Name", "Value");
}
Application.UnLock();
答案 1 :(得分:1)
据我所知,RemoveAll是线程安全的,因为它在内部调用Clear方法。 Clear方法调用HttpApplicationStateLock.AcquireWrite然后调用base.BaseClear并最终释放锁。
另外看看 HttpApplicationState - Why does Race condition exist if it is thread safe?