下載app免費領(lǐng)取會員
先看一個普通事件例子:
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)普通事件的垃圾回收是有一個問題的,當(dāng)然這個是可以通過取消訂閱解決的,但是有沒有更智能一點的辦法呢?
下面看看弱事件的效果:
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)載。
上一篇:二次開發(fā)教程:Revit開發(fā)之管道的布管系統(tǒng)配置
推薦專題