2009-04-13 8 views
9

각 실행 컨텍스트가 구성 정보를로드/다시로드하지 않아도 스레드 안전 인터페이스를 통해 사용자 지정 System.Configuration 기반 구성 데이터에 액세스하는 쉬운 방법이 있습니까? 이는 계산적으로 부담이 될 수 있습니다.System.Configuration의 스레드 안전 사용

System.Configuration 클래스 (모든?) 마이크로 소프트의 닷넷 라이브러리 설명서에서 다른 클래스는 다음 스레드 안전 정보와 주석이 대부분 같은 :

모든 공용 static (Visual Basic의 경우 Shared) 멤버 이 유형의 스레드는 안전합니다. 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 수 있습니다. 이 내 읽어

ConfigurationSection 개체 (예 OpenExeConfiguration(string exePath).GetSection(string))는 스레드 안전하다고 가정해서는 안 ConfigurationManager.GetSection(string) 및 다른 유사한 방법에서 반환함으로써 여러 실행 컨텍스트에서 사용되어서는 안된다. 이렇게하면 섹션 객체에 대한 액세스가 안전 할 수는 있지만 객체 자체의 멤버는 안전하지 않기 때문에 스레드 안전성이있는 싱글 톤으로 ConfigurationSection을 저장할 수 없습니다. GetSection

여러 차례 호출은, 그러나, 지금까지 초기화 후 변경 될 수없는 설정 파일의 재 해석하고 구성을 고려하여 높은 오버 헤드가 새 ConfigurationSection 인스턴스를 할당을 필요로 할 가능성이 높다. 또한 스레드 안전성을 가진 다른 객체에 구성 데이터를 복사하면 처음부터 기본 제공 구성 패키지를 사용하면 얻을 수있는 주요 이점 중 하나를 무력화하는 것처럼 보입니다 (많은 상용구없이 유형 변환되고 유효성이 검사 된 구성 정보에 쉽게 액세스 할 수 있습니다) 암호).

그렇다면 과도한 구문 분석과 구성 섹션 할당에 의존하지 않고 System.Configuration을 스레드로부터 안전하게 사용할 수 있습니까? 자신의 ConfigurationSection을 구현하면 System.Configuration 인터페이스를 통해 액세스하는 경우에도 Microsoft가 제공하는 보증의 부족으로부터 자유 로워집니다 (그렇다면 기본으로 액세스 할 때 스레드로부터 안전 할 수 있도록 구현하는 방법은 무엇입니까? ConfigurationSection의 인덱서). 구성된 데이터에 액세스하는 데 필요합니까?)

답변

5

GetSection에서 반환 된 인스턴스는 스레드로부터 안전하지 않습니다. 즉, 싱글 톤에서 사용하려면 잠금 코드를 추가해야합니다.

파일이 변경되지 않는 한 여러 호출이 파일을 다시 구문 분석하지 않습니다. 데이터는 메모리에 캐시됩니다.

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

+0

저는 IIS 서버가 지난 5 개월 동안 무작위 적으로 충돌하고있었습니다. MSCorLib에서 스택 오버플로가 발생하는 이유는 알 수 없었습니다. 내 dev 컴퓨터에서 일어날 때까지는, 그리고 appsettings 호출로 인해 발생했습니다. 나는 이것이 나의 질문에 대답한다고 생각한다. 감사. –

0

ConfigurationManager.GetSection (string)은 공용 정적 멤버이며 msdn에서 '이 형식의 모든 공용 정적 멤버 (Visual Basic의 경우 Shared)는 스레드로부터 안전합니다.'라는 말 때문에 안전하게 사용할 수 있다고 가정 할 수 있습니다.

성능면에서 나는 MS가 이미 매우 효율적으로 만들고 그 기능을 그대로 사용한다고 가정하고 싶습니다. 기억하십시오 : 조기 최적화는 악의 뿌리입니다.