2012-08-22 2 views
0

상당히 복잡한 (다중 문서) XML 구조 편집 &을 읽는 것을 기반으로하는 GUI 응용 프로그램을 작성하고 있습니다. GUI 자체는 주로 데이터 바인딩을 기반으로하므로 대부분 XML과의 상호 작용은 LINQ to XML을 사용하는 객체 기반 모델을 통해 UI 스레드에서 수행되지만 일부 작업 (예 : 검색 및 로드)는 백그라운드 스레드에서 수행해야하므로 스레드로부터 안전한 방식으로이 XML에 액세스해야합니다. 나를 XML의 모든 편집이 스레드 안전 (예 : 글로벌 잠금 또는 UI 스레드에서 모든 편집을 수행하여) 있는지 확인하기 쉬운만큼XObject에 대한 잠금/스레드 안전 액세스

그것의, 그러나 나는 알 그 XObject 상태

에 대한 설명서

이 형식의 모든 공용 static 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 수 있습니다. 내 응용 프로그램에서 사용 모든 액세스 에 대한XObject 인스턴스를 동기화해야 함을 의미

. 불행하게도 내 개체 모델이 작동하는 방식 때문에 내 모델의 개체 중 최대 하나의 인스턴스가 XObject에 액세스하는 것을 보장하기가 어렵습니다. 즉, 개인 개체를 잠그면 스레드 안전성을 보장 할 수 없습니다. (일반적으로 교착 상태를 방지하는 최상의 방법).

이 시나리오에서는 스레드 안전을 위해 XObject에서 직접 잠금을 사용할 수 있습니까? 아니면 다른 방법이 있습니까?

답변

0

XObject 자체를 잠그지 않는 것이 좋습니다. 그것은 효과가 있을지 모르지만 일반적으로 좋은 해결책은 아닙니다 (누구든지 그렇게 할 수 있기 때문에). 대신 XObject에 비공개 주석을 추가하고 잠금을 설정할 수 있습니다. 자신에게만 액세스 할 수있는 유형의 객체를 사용하여 주석을 비공개로 만듭니다 (어셈블리 내부 에서처럼). 주석을 조회하려면 해당 유형을 알아야하기 때문에 유형이 "비공개"이면 다른 사람이 조회 할 수 없습니다.

+0

나는 주석을 사용하는 것을 생각했지만, 주석에 액세스하는 데 사용되는 메소드는 스레드 안전성이 없으므로 주석에 대한 액세스를 동기화하는 데 다른 외부 메커니즘을 사용해야 할 수도 있습니다. – Justin