2

在我的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时,读取是否也不是线程安全的?
4

2 回答 2

3

如果您对应用程序状态执行多个操作,则仅需要锁定。在你的情况下,你只是做一个操作,所以没有锁是完全安全的:

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

如果您执行多个操作,并且它们相互依赖,则需要锁定。例如:

Application.Lock();

string name = Application.Get("Name");

if (name == null) {
  Application.Set("Name", "Value");
}

Application.UnLock();
于 2013-03-26T08:10:39.813 回答
1

据我所知,RemoveAll 是线程安全的,因为它在内部调用 Clear 方法。Clear 方法调用 HttpApplicationStateLock.AcquireWrite 然后调用 base.BaseClear 最后释放锁。

另请查看 HttpApplicationState - 如果它是线程安全的,为什么会存在竞争条件?

于 2013-03-26T05:52:07.500 回答