转载C#委托之多播委托( 二)

通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止

示例如下:Action为无参委托

复制代码
static void One()
{
      Console.WriteLine("One");
      throw new Exception(" Error in one");
}

static void Two()
{
    Console.WriteLine("Two"); 
}

Action d1 = One;
d1 += Two;
try
{
    d1();
}
catch (Exception)
{
    Console.WriteLine("Exception caught");
}
复制代码

委托只调用了第一个方法,因为第一个方法抛出了一个异常,所以委托的迭代会停止,不再调用Two()方法,结果:

One

Exception caught

为了避免这个问题,应自己迭代方法列表,Delegate类定义的GetInvocationList()方法,它返回一个Delegate对象数组,现在可以使用这个委托调用与委托直接相关的方法,

捕获异常,并继续下一次迭代

复制代码
Action d1 = One;
d1 += Two;

Delegate[] delegates = d1.GetInvocationList();
foreach (Action item in delegates)
{
     try
     {
           item();
      }
      catch (Exception)
      {
            Console.WriteLine("Exception caught");
       }
}
复制代码

结果如下:

One

Exception caught

Two

原文地址:https://www.cnblogs.com/akingyao/p/2843737.html