当我们定义一个事件的时候,默认会多出两个方法,分别是添加,和删除的方法
譬如
public event EventHander myEvent //我定义了这么一个事件 //那么实际上IL中会多出2个方法,大概是下面这样的 private event EventHander myEvent;// 原来的public 变为private public void add_myEvent(EventHander value){ myEvent = (EventHander)Delegate.Combine(myEvent,value) } public void remove_myEvent(EventHander value){ myEvent = (EventHander)Delegate.Remove(myEvent,value) }
实际当我们在其他调用写出myEvent+=……的时候,并没有去真正访问了myEvent,因为我们看到实际的代码已经
变成了私有的,实际上调用的是add_myEvent方法。
虽然CLR尽量实现了同步,但是还是有些问题的,这种情况我们可以自己去实现add 与remove方法,自己控制锁定
private event EventHander _myEvent;//自己定义一个私有的事件 private readonly object obj = new object();//定义个对象用来锁定 Public EventHander myEvent { add{ lock(obj ){ _myEvent+=value; } } remove{ lock(obj){ _myEvent-=value; } } }