Исключение будет немедленно распространено, и любые «более поздние» действия в списке вызовов делегата будут выполнены , а не. Если вы хотите, чтобы вы выполнили все, делегаты, возможно, объединив все исключения вместе, например, вам нужно позвонить Delegate.GetInvocationList
, отбросить каждого из этих делегатов того же типа, что и оригинал, и вызвать их одним один, улавливая исключения, когда их бросали.
Вот пример кода, который делает это - было бы неплохо сделать это более общим образом, идеально построив новый делегат, который (при исполнении) выполнил бы все составные делегаты и заполнил бы исключения ... но это начало.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
public static void Main()
{
Action x = null;
x +=() => Console.WriteLine("First");
x +=() => { throw new Exception("Bang 1"); };
x +=() => { throw new Exception("Bang 2"); };
x +=() => Console.WriteLine("Second");
try
{
ExecuteAll<Action>(x, action => action());
}
catch (AggregateException e)
{
Console.WriteLine(e);
}
}
public static void ExecuteAll<T>(Delegate multi, Action<T> invoker)
{
List<Exception> exceptions = new List<Exception>();
foreach (var single in multi.GetInvocationList())
{
try
{
invoker((T)(object)single);
}
catch (Exception e)
{
exceptions.Add(e);
}
}
if (exceptions.Count > 0)
{
throw new AggregateException(exceptions);
}
}
}
Привет, Джон, спасибо, это именно то, что я пытался понять. Что ж. Одна вещь, которую я не понимаю в вашем заявлении, заключается в следующем: «Передача каждого из этих делегатов одному типу» означает, что вы говорите о нескольких отдельных делегатах? хм, извините, не мог понять это, поскольку я новичок в этом .... Я знаю, что это может быть глупо .... – Learner
@Divine: Каждый из элементов массива, возвращаемых 'GetInvocationList', является тем же типом, что и оригинал делегат - но один с одним действием. Это прекрасно, если вас это смущает - отсутствие хорошей терминологии не помогает :( –
Здесь я думаю, что я немного смущен термином «тип» ... тип относится к типу возврата, о котором вы говорите? Или подписи? знал, что void - это тип возврата для делегатов многоадресной передачи ... и фантастическая программа для меня, чтобы понять ... Я буду использовать это в своем VS и понять это сейчас .... :) Большое вам спасибо, Jon, я ценю это. .. :) – Learner