Skip to content

C# 多线程 07-使用 PLINQ 04-处理 PLINQ 查询中的异常

🏷️ 《C# 多线程》

示例代码

csharp
/// <summary>
/// 处理 PLINQ 查询中的异常
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    IEnumerable<int> numbers = Enumerable.Range(-5, 10);

    Console.WriteLine("执行顺序的 LINQ 查询");
    var query = from number in numbers
                select 100 / number;
    try
    {
        foreach (var n in query)
        {
            Console.WriteLine(n);
        }
    }
    catch (DivideByZeroException)
    {
        Console.WriteLine("被 0 除!");
    }
    
    Console.WriteLine("---");
    Console.WriteLine();

    Console.WriteLine("执行并行的 LINQ 查询");
    var parallelQuery = from number in numbers.AsParallel()
                        select 100 / number;
    try
    {
        parallelQuery.ForAll(Console.WriteLine);
    }
    catch (DivideByZeroException)
    {
        Console.WriteLine("被 0 除! - 通常的异常处理");
    }
    catch (AggregateException e)
    {
        e.Flatten().Handle(ex => {
            if (ex is DivideByZeroException)
            {
                Console.WriteLine("被 0 除! - Aggregate 异常处理");
                return true;
            }
            return false;
        });
    }
    Console.WriteLine("---");

    Console.ReadLine();
}

运行结果

txt
执行顺序的LINQ查询
-20
-25
-33
-50
-100
被0除!
---

执行并行的LINQ查询
-20
-100
-50
-33
-25
33
25
50
100
被0除! - Aggregate异常处理
---

总结

PLINQ 时得到的是 AggregateException,可以使用 Flattenhandle 方法来处理内部的 DivideByZeroException