C# 弱事件


先看一个普通事件例子:
    class Program
    {
        static void Main(string[] args)
        {
            CarDealer dealer = new CarDealer();
            Consumer micheal = new Consumer("Micheal");
            dealer.NewCarInfo += micheal.NewCarIsHere;
            Consumer sebastian = new Consumer("Sebastian");
            dealer.NewCarInfo += sebastian.NewCarIsHere;
            dealer.NewCar("Ferrari");
            sebastian = null;
            GC.Collect();
            dealer.NewCar("Ferrari");//两次输出是相同的,说明sebastianb并没有回收掉
            Console.ReadLine();
        }
    }

    public class CarInfoEventArgs:EventArgs
    {
        public CarInfoEventArgs(string car)
        {
            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);
        }
        protected virtual void RaiseNewCarInfo(string car)
        {
            if(NewCarInfo!=null)
            {
                NewCarInfo(this, new CarInfoEventArgs(car));
            }
        }
    }
    public class Consumer
    {
        private string _name = string.Empty;
        public Consumer(string name)
        {
            _name = name;
        }

        public void NewCarIsHere(object sender,CarInfoEventArgs e)
        {
            Console.WriteLine("{0}:Car {1} is new", _name, e.Car);
        }
    }


通过上面红色字发现普通事件的垃圾回收是有一个问题的,当然这个是可以通过取消订阅解决的,但是有没有更智能一点的办法呢?

下面看看弱事件的效果:

    class Program
    {
        static void Main(string[] args)
        {
            CarDealer dealer = new CarDealer();
            Consumer micheal = new Consumer("Micheal");
            GC.Collect();
            WeakCarInfoEventManager.AddListener(dealer, micheal);
            Consumer sebastian = new Consumer("Sebastian");
            WeakCarInfoEventManager.AddListener(dealer, sebastian);   
            dealer.NewCar("Ferrari");
            sebastian = null;
            GC.Collect();
            dealer.NewCar("Ferrari");//不再输出sebastian的内容,说明sebastian已经回收了
            Console.ReadLine();
        }
    }

    public class CarInfoEventArgs : EventArgs
    {
        public CarInfoEventArgs(string car)
        {
            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);
        }
        protected virtual void RaiseNewCarInfo(string car)
        {
            if (NewCarInfo != null)
            {
                NewCarInfo(this, new CarInfoEventArgs(car));
            }
        }
    }
    public class Consumer:IWeakEventListener
    {
        private string _name = string.Empty;
        public Consumer(string name)
        {
            _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;
        }
    }

    public class WeakCarInfoEventManager : WeakEventManager
    {
        private WeakCarInfoEventManager()
        {

        }
        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
            {
                WeakCarInfoEventManager _currentManager = GetCurrentManager(typeof(WeakCarInfoEventManager)) as WeakCarInfoEventManager;
                if (_currentManager == null)
                {
                    _currentManager = new WeakCarInfoEventManager();
                    SetCurrentManager(typeof(WeakCarInfoEventManager), _currentManager);
                }
                return _currentManager;
            }
        }
        protected override void StartListening(object source)
        {
            (source as CarDealer).NewCarInfo += WeakCarInfoEventManager_NewCarInfo;
        }

        private void WeakCarInfoEventManager_NewCarInfo(object sender, CarInfoEventArgs e)
        {
            DeliverEvent(sender, e);
        }

        protected override void StopListening(object source)
        {
            (source as CarDealer).NewCarInfo -= WeakCarInfoEventManager_NewCarInfo;
        }
    }

结果显而易见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值