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:
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 { } } } |