// WeakMulticastDelegate 实现
public class WeakMulticastDelegate
{
private List<WeakReference<Action>> _delegates = new List<WeakReference<Action>>();
// 添加委托
public void Add(Action handler)
{
_delegates.Add(new WeakReference<Action>(handler));
}
// 移除委托
public void Remove(Action handler)
{
_delegates.RemoveAll(wr =>
{
if (wr.TryGetTarget(out var target))
{
return target == handler;
}
return false;
});
}
// 调用委托
public void Invoke()
{
for (int i = _delegates.Count - 1; i >= 0; i--)
{
if (_delegates[i].TryGetTarget(out var target))
{
target(); // 调用委托方法
}
else
{
_delegates.RemoveAt(i); // 移除已被回收的委托
}
}
}
}
// 事件源
public class EventSource
{
public WeakMulticastDelegate OnEvent = new WeakMulticastDelegate();
public void TriggerEvent()
{
Console.WriteLine("Event triggered!");
OnEvent.Invoke(); // 触发事件
}
}
// 订阅者
public class Subscriber
{
public string Name { get; set; }
public Subscriber(string name)
{
Name = name;
}
public void HandleEvent()
{
Console.WriteLine($"{Name} handled the event!");
}
}
// 测试程序
public class Program
{
public static void Main()
{
// 创建事件源
var eventSource = new EventSource();
// 创建订阅者
var subscriber1 = new Subscriber("Subscriber 1");
var subscriber2 = new Subscriber("Subscriber 2");
// 订阅事件
eventSource.OnEvent.Add(subscriber1.HandleEvent);
eventSource.OnEvent.Add(subscriber2.HandleEvent);
// 触发事件
eventSource.TriggerEvent();
// 销毁一个订阅者
subscriber1 = null;
GC.Collect(); // 强制垃圾回收
Console.WriteLine("After destroying Subscriber 1:");
// 再次触发事件
eventSource.TriggerEvent(); // 只有 Subscriber 2 会处理事件
}
}