c# - Multicast Delegate中方法出现Exception时会发生什么

标签 c# .net

我想了解在多播委托(delegate)中处理异常的最佳方式是什么?

我的问题是,如果方法在多播委托(delegate)执行中抛出异常会怎样?它会停止吗?继续 ?怎么处理 ?如果有人可以分享,一个带解释的小程序将非常有帮助......谢谢......

最佳答案

异常将立即传播,委托(delegate)调用列表中的任何“稍后”操作将不会执行。如果您想确保执行所有 委托(delegate) - 例如,可能将所有异常聚合在一起 - 您需要调用 Delegate.GetInvocationList ,将这些委托(delegate)中的每一个转换为与原始委托(delegate)相同的类型,并一个一个地调用它们,在它们被抛出时捕获异常。

这是执行此操作的一些示例代码 - 以更通用的方式执行此操作会很好,理想情况下构建一个新委托(delegate),该委托(delegate)(在执行时)将执行所有组成委托(delegate)并聚合异常...但这是一个开始。

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

关于c# - Multicast Delegate中方法出现Exception时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11234854/

相关文章:

c# - 如何将 Facebook 赞按钮集成到我们的 asp.net c# 网站

c# - 如何使用ConfigurationManager解析app.config?

c# - 浏览器成功但 HttpWebRequest 失败(超时)

.net - 您能否轻松地将 WPF 应用程序转换为 WPF XBAP 应用程序?

c# - 我的 Visual Studio 2008 Web 应用程序在首次运行时不断抛出 .Net 错误,但刷新后可以解决该问题

C# BackgroundWorker线程问题

c# - 遍历静态类的属性来填充列表?

c# - WPF:触发动画 - 沿 Y 轴向下移动控件

c# - 有什么方法可以在显示上下文菜单之前获取它的宽度?

.net - LINQ to SQL - 按小时分组