2012-11-08 2 views
4

나는 XML 문서를 deserialize하고 그것으로부터 객체를 만드는 함수를 가지고있다.C# : lock 문 내부의 콜백 함수도 잠겨 있습니까?

개체를 캐시에 저장하여 데이터를 가져올 때마다 xml을 deserialize 할 필요가 없습니다.

public class XMLDeserializer 
{ 
    public event OnElementDeserialized OnElementDeserializedCallback; 

    public void DeserializeXml(string xmlPath) 
    { 
     // implementation 
    } 
} 

public class XMLDeserializerFacade 
{ 
    private static object _lockObject = new object(); 

    private XMLDeserializer xmlDeserializer; 
    private ICacheProvider cacheProvider; 
    public XMLDeserializerFacade(XMLDeserializer xmlDeserializer, ICacheProvider cacheProvider) 
    { 
     this.xmlDeserializer = xmlDeserializer; 
     this.cacheProvider = cacheProvider; 

     xmlDeserializer.OnElementDeserializedCallback += delegate(object element) 
     { 
      cacheProvider.Add("uniqueKey", element); 
      // is here in lock as well or i have to lock it again? 
     }; 
    } 

    public void DeserializeXml(string xmlPath) 
    { 
     lock(_lockObject) 
     { 
      xmlDeserializer.DeserializeXml(xmlPath); 

      // From here it will go to 
      // cacheProvider.Add("uniqueKey", element); callback 
     } 
    } 
} 

내가 XML을 역 직렬화 할 때, 나는

XMLDeserializerFacade.DeserializeXml("file.xml") 

내 질문에 전화를 내가뿐만 아니라 OnElementDeserializedCallback 콜백 내부도 lock를 사용한다는 것입니다?

고맙습니다.

답변

4

특정 구현에 많은 영향을받습니다. 해당 코드를 기본 스레드 인 lock/DeserializeXml과 동일한 스레드에 있고 동기 버전 (OnElementDeserializedCallback(...) 또는 OnElementDeserializedCallback.Invoke(...))을 사용하는 경우 - 잠금은 본질적으로 실.

구현은 비동기 구현 (BeginInvoke, Task, ThreadPool 등)을 사용하는 경우

후 번호 : 그것은 하지 잠금 안에 없을 것이다.

확실하지 않은 경우 일 수 있습니다 (잠금은 재 입력이므로 동일한 스레드에서 중첩 잠금을 두 번 끝내면 문제가되지 않습니다). 그것이 밝혀지면 그러나 비동기이지만, 다음은 완전히 교착 수 다시 콜백 (Delegate.EndInvoke, Task.Wait 등)에 가입에 또한 다음을 시도합니다.

+0

잠금을 두 번 잠글 것입니다. – Catalin

+1

완전히 교착 상태가 있습니다. :) – flindeberg