2013-03-26 1 views
1

asp.net 응용 프로그램에서 일부 데이터를 HttpApplicationState에 캐시하고 싶습니다. 데이터를 설정하는HttpApplicationState.RemoveAll() 스레드는 안전합니까?

내 코드는 다음과 같습니다

Application.Lock(); 

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

Application.UnLock(); 

나는 문서를 읽을 때, 그것은 HttpApplicationState이 암시 적으로 스레드에 안전 것을 말한다. 그러나 많은 블로그에서 HttpApplicationState에 데이터를 쓰는 동안 Application.Lock()Application.Unlock()을 사용해야한다고 썼습니다.

한편, HttpApplicationState에서 데이터를 읽거나 (Application.RemoveAll()을 사용하여) 데이터를 지우는 동안 잠금을 사용해야한다고 말하는 설명서를 찾을 수 없습니다.

내 질문은 : 우리가 RemoveAll를 호출 할 때

  1. 우리는 스레드 안전을 돌볼하지 않나요? 내 응용 프로그램에서는 한 스레드가 HttpApplicationState에서 데이터를 읽는 중일 수 있지만 다른 스레드는 RemoveAll을 호출 할 수 있습니다.
  2. 이 경우 두 개의 다른 스레드에서 동시에 HttpApplicationState을 읽고 지울 수있을 때 읽기는 스레드 안전이 아니어야합니까?

답변

2

를 보라. 당신이 당신이 한 작업을하고있는 케이스, 그래서 잠금없이 완벽하게 안전 : 둘 이상의 작업을 수행하고 서로에 의존하는 경우에는 잠금이 필요

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

. 여러 스레드가 이미 '읽기'는 다른 어떤 스레드가 '에서 removeAll'호출 HttpApplicationState있는 상황이

Application.Lock(); 

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

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

Application.UnLock(); 
1

내가 알 수있는 한 RemoveAll은 내부적으로 Clear 메서드를 호출하므로 스레드로부터 안전합니다. Clear 메서드는 HttpApplicationStateLock.AcquireWrite를 호출 한 다음 base.BaseClear를 호출하고 마지막으로 잠금을 해제합니다.

또한 응용 프로그램의 상태에 대해 하나 이상의 작업을하고있는 경우에만 잠금이 필요 HttpApplicationState - Why does Race condition exist if it is thread safe?

+0

1. 어떤 경우 : 예를 들어? 또는 다른 방법 라운드? 2. 심지어 Application.Set() 메서드는 내부적으로 잠금을 획득합니다. 그러나 여전히 Application.Lock과 UnLock을 사용하는 것이 좋습니다. 비슷한 이유로, RemoveAll을 호출 할 때 잠금을 사용할 필요가 없습니까 (또는 권장하지 않는 이유는 무엇입니까?)? – Learner

+0

전체 개체는 http://msdn.microsoft.com/en-us/library/system.web.httpapplicationstate.aspx에서 설명한 것처럼 스레드로부터 안전합니다. ILSpy를 사용하여 코드를 살펴보면, 대부분의 작업에는 해당 코드가 잠겨 있음을 알 수 있습니다. 즉 공용 개체 가져 오기 (문자열 이름) { \t 개체 결과 = null; \t this._lock.AcquireRead(); \t 시도 \t { \t \t result = base.BaseGet (이름); \t} \t 마지막 \t \t \t { this._lock.ReleaseRead을(); \t} \t 반환 결과; } –

관련 문제