#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); }