내 asp.net
응용 프로그램에서 일부 데이터를 HttpApplicationState
에 캐시하고 싶습니다. 데이터를 설정하는HttpApplicationState.RemoveAll() 스레드는 안전합니까?
내 코드는 다음과 같습니다
Application.Lock();
Application.Set("Name", "Value");
Application.UnLock();
나는 문서를 읽을 때, 그것은 HttpApplicationState
이 암시 적으로 스레드에 안전 것을 말한다. 그러나 많은 블로그에서 HttpApplicationState
에 데이터를 쓰는 동안 Application.Lock()
과 Application.Unlock()
을 사용해야한다고 썼습니다.
한편, HttpApplicationState
에서 데이터를 읽거나 (Application.RemoveAll()
을 사용하여) 데이터를 지우는 동안 잠금을 사용해야한다고 말하는 설명서를 찾을 수 없습니다.
내 질문은 : 우리가 RemoveAll
를 호출 할 때
- 우리는 스레드 안전을 돌볼하지 않나요? 내 응용 프로그램에서는 한 스레드가
HttpApplicationState
에서 데이터를 읽는 중일 수 있지만 다른 스레드는RemoveAll
을 호출 할 수 있습니다. - 이 경우 두 개의 다른 스레드에서 동시에
HttpApplicationState
을 읽고 지울 수있을 때 읽기는 스레드 안전이 아니어야합니까?
1. 어떤 경우 : 예를 들어? 또는 다른 방법 라운드? 2. 심지어 Application.Set() 메서드는 내부적으로 잠금을 획득합니다. 그러나 여전히 Application.Lock과 UnLock을 사용하는 것이 좋습니다. 비슷한 이유로, RemoveAll을 호출 할 때 잠금을 사용할 필요가 없습니까 (또는 권장하지 않는 이유는 무엇입니까?)? – Learner
전체 개체는 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 반환 결과; } –