完善主體資料,免費(fèi)贈(zèng)送VIP會(huì)員!
    * 主體類型
    * 企業(yè)名稱
    * 信用代碼
    * 所在行業(yè)
    * 企業(yè)規(guī)模
    * 所在職位
    * 姓名
    * 所在行業(yè)
    * 學(xué)歷
    * 工作性質(zhì)
    請先選擇行業(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接口

    主站蜘蛛池模板: 成人日韩熟女高清视频一区| 亚洲视频在线观看一区| 亚洲日本久久一区二区va| 丰满人妻一区二区三区视频| 亚洲日本一区二区一本一道| 99久久精品国产免看国产一区 | 无码精品一区二区三区| 久久久久久人妻一区二区三区 | 色妞色视频一区二区三区四区| 亚洲Av高清一区二区三区| 久久久久久人妻一区二区三区| 国产成人久久一区二区三区| 国产在线视频一区| 人妻aⅴ无码一区二区三区| 在线成人一区二区| 无码人妻一区二区三区免费视频 | 亚洲综合无码一区二区痴汉| 国产日韩综合一区二区性色AV| 国产一区二区三区在线视頻| 亚洲国产成人一区二区精品区| 国产情侣一区二区| 国产精品一区二区久久国产| 亚洲av乱码一区二区三区按摩 | 亚洲熟女少妇一区二区| 亚洲熟妇无码一区二区三区| 夜夜爽一区二区三区精品| 免费无码一区二区三区| 视频一区二区三区在线观看| 少妇激情av一区二区| 国产一区在线电影| 亚洲一区二区三区四区视频| 亚洲日本一区二区一本一道| 亚洲一区精彩视频| 国产爆乳无码一区二区麻豆| 日韩在线视频一区二区三区| 蜜桃臀无码内射一区二区三区| 视频一区在线播放| 在线免费视频一区二区| 精品视频无码一区二区三区| 国产成人精品无人区一区| 中文字幕无线码一区2020青青|