在使用多播委托时,假设方法列表中有多个方法,但委托执行到某个方法时抛出异常,那么整个委托的迭代将在抛出异常的地方退出终止。后面的方法也不会再执行。
例如:
假设定义一个包含方法的类:
SumMethod()方法输出20,然后产生一个异常;
MultiMethod ()方法输出100; namespace Delegates
{
class MethodCollection
{
//方法1: 该方法执行会报出异常
static void SumMethod()
{
Console.WriteLine("The SumMethod ! {0}", 10 + 10);
throw new Exception("One Error In The Method");
}
//方法2:
static void MultiMethod()
{
Console.WriteLine("The MultiMethod ! {0}", 10 * 10);
}
}
}
在主程序中定义一个多播委托,然后调用委托观察结果,主程序如下:
namespace Delegates
{
class MainProgram
{
static void Main()
{
//定义一个委托
Action multiCastDelegate;
multiCastDelegate = MethodCollection.SumMethod;
//叠加另外一个方法,即创建多播委托
multiCastDelegate += MethodCollection.MultiMethod;
//调用委托
try
{
multiCastDelegate();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
当调用SumMethod()方法后,抛出异常,这使得后面的MultiMethod()方法未执行。
为了避免这种情况,即在抛出异常后依然执行后面的方法,我们做如下改进:定义自己的迭代方法列表
由于Delegate类定义了GetInvocationList()方法,它返回Delegate对象的数组。我们可以以此建立自己的迭代方法列表,在抛出异常后继续执行后面的方法。
namespace Delegates
{
class MainProgram
{
static void Main()
{
//定义一个委托
Action multiCastDelegate;
multiCastDelegate = MethodCollection.SumMethod;
//叠加另外一个方法,即创建多播委托
multiCastDelegate += MethodCollection.MultiMethod;
//定义方法列表数组,使用GetInvocationList()
//注意使用的是Delegate类,不是delegate关键字
Delegate[] delegates = multiCastDelegate.GetInvocationList();
foreach (Action d in delegates)
{
//调用委托
try
{
d();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
}