Weak Reference Event Pattern (`WeakEventManager`)
1Concept
The Weak Event pattern maintains weak references (`WeakReference<T>`) to subscribers. If the subscriber has no other strong references, the GC reclaims it without requiring explicit unsubscription.
2Architecture Diagram
Publisher ──WeakReference──> Subscriber
│ (No strong GC root)
▼
Collected cleanly by GC!3Code Example
C# 13 & .NET 9
using System;
public class WeakEventSource
{
private WeakReference<Action<string>>? _weakHandler;
public void SetListener(Action<string> handler)
{
_weakHandler = new WeakReference<Action<string>>(handler);
}
public void Raise(string msg)
{
if (_weakHandler != null && _weakHandler.TryGetTarget(out var target))
{
target(msg);
}
else
{
Console.WriteLine("Listener was garbage collected; event suppressed.");
}
}
}
public class WeakEventDemo
{
public static void Main()
{
var source = new WeakEventSource();
source.SetListener(msg => Console.WriteLine($"Weak Message: {msg}"));
source.Raise("Ping 1");
}
}4Expected Output
Weak Message: Ping 1
5Key Takeaways
- ✓Weak events prevent memory leaks in UI frameworks (WPF/MAUI) and long-running message buses.
- ✓Check `TryGetTarget` before invocation.
- ✓Slightly higher dispatch overhead than direct delegates.