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();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
运行结果
txt
执行顺序的LINQ查询
-20
-25
-33
-50
-100
被0除!
---
执行并行的LINQ查询
-20
-100
-50
-33
-25
33
25
50
100
被0除! - Aggregate异常处理
---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
总结
PLINQ 时得到的是 AggregateException
,可以使用 Flatten
和 handle
方法来处理内部的 DivideByZeroException
。