Safe invoke multicast delegate C# with Example



Safe invoke multicast delegate C# with Example

Ever wanted to call a multicast delegate but you want the entire invokation list to be called even if an exception 
occurs in any in the chain. Then you are in luck, I have created an extension method that does just that, throwing an 
AggregateException only after execution of the entire list completes: 
public static class DelegateExtensions 
{ 
public static void SafeInvoke(this Delegate del,params object[] args) 
{ 
var exceptions = new List(); 
foreach (var handler in del.GetInvocationList()) 
{ 
try 
{ 
handler.Method.Invoke(handler.Target, args); 
} 
catch (Exception ex) 
{ 
exceptions.Add(ex); 
} 
} 
if(exceptions.Any()) 
{ 
throw new AggregateException(exceptions); 
} 
 

} 
} 
public class Test 
{ 
public delegate void SampleDelegate(); 
public void Run() 
{ 
SampleDelegate delegateInstance = this.Target2; 
delegateInstance += this.Target1; 
try 
{ 
delegateInstance.SafeInvoke(); 
} 
catch(AggregateException ex) 
{ 
// Do any exception handling here 
} 
} 
private void Target1() 
{ 
Console.WriteLine("Target 1 executed"); 
} 
private void Target2() 
{ 
Console.WriteLine("Target 2 executed"); 
throw new Exception(); 
} 
} 
This outputs: 
Target 2 executed 
Target 1 executed 
Invoking directly, without SaveInvoke, would only execute Target 2. 

0 Comment's

Comment Form