-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

你可能感兴趣的:(C#)