Как работает addedeventargs для mvvm? - PullRequest
1 голос
/ 11 марта 2011

Если у меня есть фрагмент кода, который я нашел в моем старом проекте.Я просто не могу понять, почему я включил этот.

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.Мне просто интересно, какие функции это имеет в приложении.

Чтобы прояснить, я говорю о втором операторе if с ParkingAddedEvent.

1 Ответ

1 голос
/ 11 марта 2011

Сначала вы проверяете, есть ли какие-либо прослушиватели событий для ParkingAddedEvent, и если они есть, вы будете вызывать событие. Эффект этого события зависит от слушателей.

Реализация, которая у вас есть, не является поточно-ориентированной. Следующее должно быть потокобезопасной альтернативой:

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

Я использую Thread.MemoryBarrier() для предотвращения оптимизации компилятора, которая может устранить локальную переменную. Если это произойдет, код будет идентичен вашей текущей реализации.

Существует также другая проблема безопасности потока с инициализатором коллекции, но это проблема, только если метод AddParking() вызывается из разных потоков.

...