C# Language Appel de sécurité multicast délégué


Exemple

Vous avez toujours voulu appeler un délégué multidiffusion mais vous souhaitez que la liste complète des invocations soit appelée même si une exception se produit dans la chaîne. Ensuite, vous avez de la chance, j'ai créé une méthode d’extension qui ne fait que cela, en lançant une AggregateException uniquement une fois l’exécution de la liste complète terminée:

public static class DelegateExtensions
{
    public static void SafeInvoke(this Delegate del,params object[] args)
    {
        var exceptions = new List<Exception>();

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

Cela produit:

Target 2 executed
Target 1 executed

L'appel direct, sans SaveInvoke , n'exécutera que Target 2.