Looking for c# Keywords? Try Ask4Keywords

C# Language Деактивировать многоадресную рассылку


пример

Когда-либо хотелось вызвать делегата многоадресной рассылки, но вы хотите, чтобы весь список вызовов был вызван, даже если исключение происходит в любом из цепочки. Тогда вам повезло, я создал метод расширения, который делает именно это, бросая AggregateException только после завершения полного списка:

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

Эти результаты:

Target 2 executed
Target 1 executed

Вызов напрямую, без SaveInvoke , выполнит только Target 2.