c#弱事件(weakEvent)

对于事件,如果发布者和订阅者直接连接的话,会发生垃圾回收问题,通过弱事件可以很好的解决该问题

一、首先定义一个时间发布者

    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();
        }

执行效果如下


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值