2011-03-11 2 views
1

내 오래된 프로젝트에서 찾은 스 니펫 코드가있는 경우. 나는 왜 내가 이것을 포함 시켰는지 알 수 없다.mvvm에서 추가 된 이벤트는 어떻게 작동합니까?

public void AddParking(Parking parking) 
    { 
     if (allParkings == null) 
     { 
      allParkings = new ObservableCollection<Parking>(); 
     } 
     allParkings.Add(parking); 

     if (ParkingAddedEvent != null) 
     { 
      ParkingAddedEvent(this, new ParkingAddedEventArgs(parking)); 
     } 
    } 

이것은 모델 폴더에있는 ParkingRepository 클래스에 있습니다. mvvm light 툴킷을 사용하고 있습니다. 이 기능이 앱에 어떤 기능이 있는지 궁금합니다.

두 번째 if 문에 대해 ParkingAddedEvent를 사용하여 명확하게 설명합니다.

답변

1

먼저 ParkingAddedEvent에 대한 이벤트 리스너가 있는지 확인한 다음 이벤트가있는 경우 이벤트를 발생시킵니다. 이 이벤트의 효과는 리스너에 따라 다릅니다.

여기에있는 구현은 스레드로부터 안전하지 않습니다.

var handler = ParkingAddedEvent; 
Thread.MemoryBarrier(); 
if (handler != null) { 
    handler(this, new ParkingAddedEventArgs(parking)); 
} 

내가 로컬 변수를 제거 할 수 컴파일러 최적화를 방지하기 위해 Thread.MemoryBarrier()를 사용 : 다음은 스레드 안전 대안이 될 것이다. 그렇게되면 코드는 현재 구현과 동일합니다.

컬렉션 이니셜 라이저에는 또 다른 스레드 안전성 문제가 있지만, 이는 AddParking() 메서드가 다른 스레드에서 호출 된 경우에만 문제가됩니다.

관련 문제