完善主體資料,免費(fèi)贈(zèng)送VIP會(huì)員!
    * 主體類型
    * 企業(yè)名稱
    * 信用代碼
    * 所在行業(yè)
    * 企業(yè)規(guī)模
    * 所在職位
    * 姓名
    * 所在行業(yè)
    * 學(xué)歷
    * 工作性質(zhì)
    請(qǐng)先選擇行業(yè)
    您還可以選擇以下福利:
    行業(yè)福利,領(lǐng)完即止!

    下載app免費(fèi)領(lǐng)取會(huì)員

    NULL

    ad.jpg

    二次開發(fā)教程:C# 弱事件

    發(fā)布于:2019-07-25 15:11:28

    網(wǎng)友投稿

    更多

    先看一個(gè)普通事件例子:

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

            }

        }




    通過上面紅色字發(fā)現(xiàn)普通事件的垃圾回收是有一個(gè)問題的,當(dāng)然這個(gè)是可以通過取消訂閱解決的,但是有沒有更智能一點(diǎn)的辦法呢?


    下面看看弱事件的效果:


        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的內(nèi)容,說明sebastian已經(jīng)回收了

                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;

            }

        }

    本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

    未標(biāo)題-1.jpg

    上一篇:二次開發(fā)教程:Revit開發(fā)之管道的布管系統(tǒng)配置

    下一篇:二次開發(fā)教程:ICommand接口

    60acb4e0ef112.png
    主站蜘蛛池模板: 精品视频一区二区三区在线观看 | 久久久国产一区二区三区| 国产精品免费一区二区三区四区| 日韩精品人妻一区二区三区四区 | 在线观看国产一区| 精品成人乱色一区二区| 精品人妻一区二区三区毛片| 亚洲熟女综合一区二区三区| 亚洲av无码一区二区三区网站| chinese国产一区二区| 毛片无码一区二区三区a片视频| 国产成人久久精品一区二区三区 | 精品国产日韩一区三区| 亚洲国产成人久久一区WWW| 国产视频一区在线播放| 亚洲一区二区三区高清不卡| 日本午夜精品一区二区三区电影 | 精品国产一区二区三区AV性色| 日本一区高清视频| 日韩精品久久一区二区三区| 国产美女在线一区二区三区| 国产精品分类视频分类一区 | 亚洲国产成人精品久久久国产成人一区二区三区综 | 一区二区视频在线免费观看| 国产成人无码精品一区不卡| 韩国女主播一区二区| 国产精品无码一区二区三区毛片| 在线观看国产一区二三区| 国产成人精品久久一区二区三区| 精品不卡一区二区| 人妻av综合天堂一区| 风间由美在线亚洲一区| 杨幂AV污网站在线一区二区| 精品福利一区二区三区| 一区二区乱子伦在线播放| 久久一区二区三区精品| 精品无人区一区二区三区在线| 国产一区二区成人| 精品人妻一区二区三区四区在线| 一区二区三区福利视频| 国产免费一区二区三区在线观看|