2011-03-11 36 views
1

如果有我在我的旧项目中找到的代码片段。我只是不明白为什么我有这个包括。addedeventargs如何为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()方法是从不同的线程调用只是一个问题。