Phase 11 of 30 · Topic 11.3

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.