addedeventargs如何为mvvm工作?

时间:2011-03-11 13:21:15

标签: wpf mvvm-light

如果有一段我在旧项目中找到的代码片段。我只是想不通为什么我把这个包括在内。

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 toolkit。我只是想知道它在应用程序中有什么功能。

为了说清楚,我正在谈论第二个if语句,使用ParkingAddedEvent。

1 个答案:

答案 0 :(得分:1)

首先检查ParkingAddedEvent是否有任何事件侦听器,如果有,则会引发事件。此事件的影响取决于听众。

此处的实现不是线程安全的。以下应该是线程安全的替代方案:

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

我使用Thread.MemoryBarrier()来阻止可以消除局部变量的编译器优化。如果发生这种情况,代码将与您当前的实现相同。

集合初始化程序还存在另一个线程安全问题,但如果从不同的线程调用AddParking()方法,那只是一个问题。