HttpApplicationState.RemoveAll()线程是否安全?

时间:2013-03-26 04:39:59

标签: asp.net .net http-caching httpapplicationstate

在我的asp.net应用程序中,我想在HttpApplicationState中缓存一些数据。

我设置数据的代码如下所示:

 Application.Lock();

 Application.Set("Name", "Value");

 Application.UnLock();

当我阅读文档时,它说HttpApplicationState是隐式线程安全的。但是在许多博客上写道,我们应该在向Application.Lock()写入数据时使用Application.Unlock()HttpApplicationState

另一方面,我找不到任何文档说明我们应该在从HttpApplicationState读取数据或清除时使用锁定(使用Application.RemoveAll())方法。

我的问题是:

  1. 在致电RemoveAll 时,我们不应该关注线程安全吗?在我的应用程序中,一个线程可能正在从HttpApplicationState读取数据,而其他线程可能会调用RemoveAll
  2. 在这种情况下,当同时从两个不同的线程读取和清除HttpApplicationState时,读取是否也不是线程安全的?

2 个答案:

答案 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?