.NET(C#) TPL:Parallel循环和多个Task的异常处理

转载自MGEN

和for/foreach中发生异常的表现一样,Parallel循环中的任何异常都会使整个循环终止,注意由于整个循环是分块同时进行的,因此整个循环不会立即终止(如果有一个线程正在进行长时间工作的话,而且是发生在CancellationToken的ThrowIfCancellationRequested方法之后)。

代码:

try
{
    Parallel.For(0, 5, (i) =>
    {
        throw new Exception("异常。迭代数字:" + i);
    });
}
catch (AggregateException ae)
{
    foreach (var exp in ae.InnerExceptions)
        Console.WriteLine(exp.Message);
}

将会输出0-4的子集(也有可能是0-4全部输出,由于5个线程都快速运行完成)。

与Parallel.For和ForEach不一样,Parallel.Invoke总是会把所有任务都执行完,然后把所有的异常包装在AggregateException中。

来看这段代码:

try
{
    Parallel.Invoke(() => { throw new Exception("1"); },
                    () => { Thread.Sleep(1500); throw new Exception("2"); },
                    () => { Thread.Sleep(3000); throw new Exception("3"); });
}
catch (Aggregate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值