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

Asp.net HttpApplicationState.RemoveAll()是否线程安全?,asp.net,.net,http-caching,httpapplicationstate,Asp.net,.net,Http Caching,Httpapplicationstate,在我的asp.net应用程序中,我想在HttpApplicationState中缓存一些数据 我设置数据的代码如下所示: Application.Lock(); Application.Set("Name", "Value"); Application.UnLock(); 当我阅读文档时,它说HttpApplicationState是隐式线程安全的。但在许多博客上,有人写道,在将数据写入HttpApplicationState时,我们应该使用Application.Lock()和Ap

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

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

 Application.Lock();

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

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

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

我的问题是:

  • 调用
    RemoveAll
    时是否应该注意线程安全?在我的应用程序中,一个线程可能正在从
    HttpApplicationState
    读取数据,而另一个线程可能调用
    RemoveAll
  • 在这种情况下,当可以同时从两个不同的线程读取和清除
    HttpApplicationState
    时,读取也应该是线程安全的吗

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

    也看看

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

    也看看

    只有在针对应用程序状态执行多个操作时,才需要锁。在您的情况下,您只需进行一次操作,因此,没有锁的情况下是完全安全的:

    Application.Set("Name", "Value");
    
    如果您执行多个操作,并且它们相互依赖,则需要锁。例如:

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

    只有在针对应用程序状态执行多个操作时,才需要锁。在您的情况下,您只需进行一次操作,因此,没有锁的情况下是完全安全的:

    Application.Set("Name", "Value");
    
    如果您执行多个操作,并且它们相互依赖,则需要锁。例如:

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

    1.如果有一种情况,当其他线程调用“RemoveAll”时,多个线程已经在“读取”HttpApplication状态,该怎么办?还是反过来?2.甚至Application.Set()方法也会在内部获取锁。但仍然建议使用应用程序。锁定和解锁。因此,出于类似的原因,为什么我们在调用RemoveAll时不需要(或不推荐)使用锁呢?完整的对象是线程安全的,如所述。只要看看使用ILSpy的代码,您就会发现大多数操作都有锁。i、 e.公共对象Get(字符串名称){object result=null;this.\u lock.acquisiteEAD();try{result=base.BaseGet(name);}最后{this.\u lock.ReleaseRead();}返回结果;}1。如果有一种情况,当其他线程调用“RemoveAll”时,多个线程已经在“读取”HttpApplication状态,该怎么办?还是反过来?2.甚至Application.Set()方法也会在内部获取锁。但仍然建议使用应用程序。锁定和解锁。因此,出于类似的原因,为什么我们在调用RemoveAll时不需要(或不推荐)使用锁呢?完整的对象是线程安全的,如所述。只要看看使用ILSpy的代码,您就会发现大多数操作都有锁。i、 e.公共对象Get(字符串名称){object result=null;this.\u lock.acquisiteEAD();try{result=base.BaseGet(name);}最后{this.\u lock.ReleaseRead();}返回结果;}