Today I remembered the need to blog again. It sounds weird, but it isn’t … A while ago I ran into a failing multicast delegate and decided to blog it. Since I ran into one again today and having to look up my previous solution again the hard way, I discovered I should have done it immediately. Check the story below:
Multicast delegates are great. Today I had to implement a custom user control (insurance cost calculation) with several child controls (one for each prospect) which depend on each other (e.g. parent and children). I use a delegate to notify the parent control that one of it’s children selections has changed.
The original call:
public event EventHandler SelectionChanged; /// <summary> /// This method cares for correct event handling /// </summary> private void OnSelectionChanged() { // The SelectionChanged event will be null if there are no subscribers. if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty); }
For some dumb reason I ran into a NRE using the delegate. Guess what happened? Subsequent delegate subscribers did not get fired anymore. The reason is that a delegate that fails for some reason, fails entirely. After researching the problem again, I changed the code provided hereabove with the following piece of code:
public event EventHandler SelectionChanged; /// <summary> /// This method cares for correct event handling, including the protection against /// failing individual event subscribers /// </summary> private void OnSelectionChanged() { // The SelectionChanged event will be null if there are no subscribers. if (SelectionChanged != null) { try { Delegate[] list = SelectionChanged.GetInvocationList(); foreach (Delegate del in list) { try { // Only the current subscriber will file, the rest of the delegate's // invocation will proceed as normal. EventHandler handler = (EventHandler) del; handler(this, EventArgs.Empty); } catch { } } } catch { } } }