完善主體資料,免費贈送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接口

      主站蜘蛛池模板: 国产一区二区精品久久岳√| 精品一区二区三区免费毛片| 91精品一区二区| 一区二区三区人妻无码| 国产一区二区三区在线观看免费| 中文字幕一区二区三区精彩视频| 精品人妻少妇一区二区三区不卡| 中文字幕无码一区二区三区本日 | 亚洲一区二区三区91| 国产一区中文字幕| 美日韩一区二区三区| 蜜臀AV免费一区二区三区| 亚洲午夜福利AV一区二区无码| 国产av夜夜欢一区二区三区| 国产日韩精品视频一区二区三区| 亚洲熟妇av一区二区三区漫画| 成人无码一区二区三区| 中文字幕在线观看一区二区| 一区二区高清在线| 韩国女主播一区二区| 无码少妇丰满熟妇一区二区| 91一区二区在线观看精品| 亚洲国产一区二区三区青草影视| 亚洲综合无码AV一区二区| 国产精品女同一区二区久久| www一区二区www免费| 精品无码人妻一区二区三区不卡| 久久久久久免费一区二区三区| 偷拍精品视频一区二区三区| 国产精品一区三区| 无码人妻精品一区二区三区东京热 | 中文字幕一区日韩精品| 亚洲精品国产suv一区88| 无码国产精品一区二区免费虚拟VR| 亚洲一区二区三区久久| 日本高清一区二区三区| 日本精品3d动漫一区二区| 国产福利一区二区| 久久99久久无码毛片一区二区| 国产成人精品视频一区二区不卡| 国产高清在线精品一区二区|