문제

계산적으로 부담이 될 구성 정보를로드/다시로드하여 각 실행 컨텍스트를 사용하지 않고 스레드-안전 인터페이스를 통한 Configuration 기반 구성 데이터에 쉽게 액세스 할 수있는 방법이 있습니까?

Microsoft의 .NET 라이브러리 문서의 다른 클래스와 같은 System.configuration 클래스는 다음 스레드 안전 정보로 주석을 달 수 있습니다.

이 유형의 모든 공개 정적 (Visual Basic에서 공유) 회원은 스레드 안전합니다. 모든 인스턴스 멤버는 스레드 안전을 보장하지 않습니다.

이것을 읽음으로써 ConfigurationSection 객체가 다시 돌아 왔습니다 ConfigurationManager.GetSection(string) 및 기타 유사한 방법 (예 : OpenExeConfiguration(string exePath).GetSection(string))는 스레드-안전한 것으로 가정해서는 안되므로 여러 실행 컨텍스트에서 사용해서는 안됩니다. 이것은 저장을 금지합니다 ConfigurationSection 섹션 객체에 대한 액세스가 안전 할 수 있지만 객체 자체의 멤버는 안전하지 않기 때문에 스레드-안전한 싱글 톤에서는 스레드 안전합니다.

여러 전화 GetSection, 그러나 구성 파일의 재판매가 필요하고 새로운 것을 할당해야 할 것입니다. ConfigurationSection 구성을 고려할 때 오버 헤드가 높은 인스턴스는 초기화 후에도 변경되지 않습니다. 또한, 구성 데이터를 다른 객체로 복사하는 것은 스레드-안전성이 처음부터 내장 구성 패키지를 사용하는 주요 이점 중 하나를 물리 치는 것으로 보인다 (많은 보일러 플레이트없이 유형 개수 및 검증 된 구성 정보에 쉽게 액세스 할 수있다. 암호).

따라서 사용 방법이 있습니까? System.Configuration 구성 섹션의 과도한 구문 분석 및 할당에 의지하지 않고 스레드 안전 방식으로? 자신만의 구현입니다 ConfigurationSection Microsoft가 제공 한 보증 부족으로부터 무료로 해당됩니다. System.Configuration 인터페이스 (그렇다면베이스에 액세스 할 때 어떻게 스레드 안전을 구현 하시겠습니까? ConfigurationSection구성된 데이터에 액세스하려면의 인덱서가 필요합니다)?

도움이 되었습니까?

해결책

getSection에서 반환 된 인스턴스는 스레드 안전이 아닙니다. 즉, 싱글 톤에서 사용하려면 잠금 코드를 추가해야합니다.

파일이 변경되지 않으면 여러 통화가 파일을 다시 정지하지 않습니다. 데이터는 메모리로 캐시됩니다.

잠금을 사용하여 스레드 안전 문제를 쉽게 해결할 수 있으며 (런타임시 구성을 변경하지 않는 한 확실하지 않음) 성능 문제가 없습니다.

다른 팁

ConfigurationManager.getSection (String)은 공개 정적 멤버이며 MSDN은 '이 유형의 공유 정적 (Visual Basic에서 공유)을 표시하기 때문에 사용하기에 안전하다고 가정 할 수 있습니다.

성능에 관해서는, 나는 MS가 이미 그것을 매우 효율적으로 만들고 그 기능을 그대로 사용했다고 가정 할 것입니다. 기억하십시오 : 조기 최적화는 악의 근원입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top