Creating a weak event






3.47/5 (9 votes)
This article shows how to use WeakDelegateSet class to create weak events. With weak events, objects can register themselves in events, but are allowed to be collected if the only references for them are such events.
Introduction
This simple article shows that creating a weak event (an event that allows objects who respond to it to be collected) is really simple with the help of the WeakDelegateSet
class.
Background
I created this class when I discovered a stupid bug (but, one that can turn to be a serious problem) in my other article. Classes that registered themselves in GCUtils.Collected
where not allowed to be collected themselves if they didn't unregister from the event. It must be a weak event, so I did it, and created a class that helps this process.
Using the code
To create a weak event, you must create a WeakDelegateSet
, and must redirect the add and remove handlers of the event to that WeakDelegateSet
. For example:
private WeakDelegateSet fMyWeakEvent = new WeakDelegateSet();
public event EventHandler MyWeakEvent
{
add
{
fMyWeakEvent.Add(value);
}
remove
{
fMyWeakEvent.Remove(value);
}
}
And then, you invoke the event using the Invoke
method in the WeakDelegateSet
, passing all the required parameters to it. So, for my example event:
fMyWeakEvent.Invoke(this, EventArgs.Empty);
This is all that is needed to create a weak event. Maybe this is not a very common requirement, but I needed the weak event to be able to collect objects that were registered for the Collected
event in case Dispose
was not invoked. And, I am sure many events may use this as many times we need to be informed of something when the object is really alive.