#394 – Raising an Event in a Thread-Safe Manner
August 22, 2011 Leave a comment
When you raise an event, you typically check to make sure that the event is not null, i.e. that at least one handler exists. This method could result in a null reference exception if another thread removes all handlers after we check for null, but before we raise the event.
A more thread-safe approach is to make a copy of the event before raising it. If a different thread removes all handlers from the original event, the copy is unaffected.
public event EventHandler Barked;
protected virtual void OnBarked()
{
EventHandler eventCopy = Barked;
if (eventCopy != null)
eventCopy(this, null);
}
A cleaner approach, also thread-safe, is to declare the event with a null handler. We can then avoid checking for null, since there will always be at least one handler.
public event EventHandler Barked = delegate { };
protected virtual void OnBarked()
{
Barked(this, null);
}