完善主體資料,免費贈送VIP會員!
      * 主體類型
      * 企業名稱
      * 信用代碼
      * 所在行業
      * 企業規模
      * 所在職位
      * 姓名
      * 所在行業
      * 學歷
      * 工作性質
      請先選擇行業
      您還可以選擇以下福利:
      行業福利,領完即止!

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發教程:C# 弱事件

      發布于:2019-07-25 15:11:28

      網友投稿

      更多

      先看一個普通事件例子:

          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;

              }

          }

      本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

      未標題-1.jpg

      上一篇:二次開發教程:Revit開發之管道的布管系統配置

      下一篇:二次開發教程:ICommand接口

      主站蜘蛛池模板: 国产天堂一区二区综合| 东京热人妻无码一区二区av| 蜜臀Av午夜一区二区三区| 91在线一区二区| 无码人妻精品一区二区三区久久久 | 内射白浆一区二区在线观看| 另类一区二区三区| 韩国精品一区视频在线播放| 蜜臀Av午夜一区二区三区| 国产亚洲一区二区在线观看| 成人国产精品一区二区网站公司| 亚洲国产一区视频| 国产一区二区三区亚洲综合| 无码中文人妻在线一区| 国产福利微拍精品一区二区 | 国产一区二区三区在线观看精品| 深夜福利一区二区| 国产在线第一区二区三区| 亚洲国产AV无码一区二区三区 | 无码国产伦一区二区三区视频| 国产高清一区二区三区四区| 日本精品一区二区久久久| 国产一区精品视频| 波霸影院一区二区| 韩国福利一区二区三区高清视频 | 日本精品无码一区二区三区久久久| 亚洲国产成人一区二区精品区| 国产成人无码一区二区三区| 日韩在线不卡免费视频一区| 日韩精品区一区二区三VR| 精品乱码一区二区三区四区| 男人的天堂av亚洲一区2区| 国产av一区最新精品| 精品视频一区二区三区在线播放| 无码AV动漫精品一区二区免费 | 国产色欲AV一区二区三区| 搜日本一区二区三区免费高清视频| 久久一区二区免费播放| 亚洲av一综合av一区| 亚洲熟妇AV一区二区三区浪潮 | 69福利视频一区二区|