对于事件,如果发布者和订阅者直接连接的话,会发生垃圾回收问题,通过弱事件可以很好的解决该问题
一、首先定义一个时间发布者
public class CarInfoEventArgs : EventArgs //自定义事件参数
{
public CarInfoEventArgs(string car)
{
this.Car = car;
}
public string Car { get; private set; }
}
汽车销售商作为事件发布者
public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo;
public void NewCar(string car)
{
Console.WriteLine("CarDealer, new car {0}", car);
RaiseNewCarInfo(car);
}
public virtual void RaiseNewCarInfo(string car)
{
EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo;
if (newCarInfo != null)
{
newCarInfo(this, new CarInfoEventArgs(car));
}
}
}
二、定义弱事件管理器
发布者和订阅者是通过Weak Event Manager进行连接而非直连
public class WeakCarInfoEventManager : WeakEventManager
{
public static void AddListener(object source, IWeakEventListener listener)
{
CurrentManager.ProtectedAddListener(source, listener);
}
public static void RemoveListener(object source,IWeakEventListener listener)
{
CurrentManager.ProtectedRemoveListener(source, listener);
}
public static WeakCarInfoEventManager CurrentManager
{
get
{
var manager = GetCurrentManager(typeof(WeakCarInfoEventManager))
as WeakCarInfoEventManager;
if (manager == null)
{
manager = new WeakCarInfoEventManager();
SetCurrentManager(typeof(WeakCarInfoEventManager), manager);
}
return manager;
}
}
protected override void StartListening(object source)
{
(source as CarDealer).NewCarInfo += CarDealer_NewCarInfo;
}
void CarDealer_NewCarInfo(object sender, CarInfoEventArgs e)
{
DeliverEvent(sender, e);
}
protected override void StopListening(object source)
{
(source as CarDealer).NewCarInfo -= CarDealer_NewCarInfo;
}
}
三、定义订阅者
订阅者要继承IWeakEventListener接口
public class Consumer : IWeakEventListener
{
private string name;
public Consumer(string name)
{
this.name = name;
}
public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Console.WriteLine("{0}:car {1} is new", name, e.Car);
}
//通过该方法来处理弱事件管理器推送过来的订阅信息
public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
{
NewCarIsHere(sender, e as CarInfoEventArgs);
return true;
}
}
四、通过main函数来调用,查看执行效果
static void Main(string[] args)
{
var carDealer = new CarDealer(); //定义事件发布者
var cons = new Consumer("consumer");//定义事件订阅者
//carDealer.NewCarInfo += tian.NewCarIsHere;
WeakCarInfoEventManager.AddListener(carDealer, cons);//通过弱事件管理器把发布者和订阅者关联起来
carDealer.NewCar("东风");//发布者激发事件。在此cons收到订阅消息
var cons1 = new Consumer("cons1");//再定义一个订阅者
WeakCarInfoEventManager.AddListener(carDealer, cons1);//关联发布者和订阅者
carDealer.NewCar("江淮");//发布者再次激发事件,此时两个订阅者都能收到订阅消息
Console.ReadKey();
}
执行效果如下