在现代C#开发中,并行编程已成为提升程序性能的重要手段。然而,当多个任务并发执行时,异常处理变得尤为复杂。如果不加以妥善处理,一个任务中的未捕获异常可能导致整个应用程序崩溃。本文将手把手教你如何在C#中自定义并行任务的异常处理,确保你的多线程程序稳定可靠。
在同步代码中,我们可以用简单的 try-catch 捕获异常。但在使用 Task、Task.Run 或 Parallel.For 等并行机制时,异常不会立即抛出,而是被“封装”在任务内部。如果你不主动检查任务状态或等待任务完成,这些异常会被静默忽略,甚至在程序退出时才暴露出来。
最简单的方式是在 await 一个任务时使用 try-catch:
try{ await Task.Run(() => { // 模拟可能出错的操作 if (DateTime.Now.Second % 2 == 0) throw new InvalidOperationException("偶数秒出错了!"); Console.WriteLine("任务成功执行。"); });}catch (Exception ex){ Console.WriteLine($"捕获到异常: {ex.Message}");} 这种方式适用于单个任务。但当我们启动多个任务时,就需要更高级的策略。
假设你同时启动了10个任务,其中某些可能失败。你可以使用 Task.WhenAll 并配合 try-catch 来统一处理所有异常:
var tasks = new List<Task>();for (int i = 0; i < 5; i++){ int index = i; // 避免闭包问题 tasks.Add(Task.Run(() => { if (index == 2 || index == 4) throw new Exception($"任务 {index} 失败!"); Console.WriteLine($"任务 {index} 成功。"); }));}try{ await Task.WhenAll(tasks);}catch (Exception ex){ // 注意:WhenAll 会将所有异常包装在一个 AggregateException 中 Console.WriteLine("至少有一个任务失败了。"); // 获取所有内部异常 var aggregateEx = ex as AggregateException; if (aggregateEx != null) { foreach (var innerEx in aggregateEx.InnerExceptions) { Console.WriteLine($"内部异常: {innerEx.Message}"); } }} 为了复用异常处理逻辑,我们可以创建一个通用方法,用于安全地执行并行任务并记录异常。这正是自定义Task异常的核心思想:
public static async Task SafeExecuteAsync(Func<Task> taskFactory, Action<Exception> onException = null){ try { await taskFactory(); } catch (Exception ex) { onException?.Invoke(ex); // 这里也可以写日志、发送警报等 Console.WriteLine($"[安全执行] 捕获异常: {ex.Message}"); }}// 使用示例await SafeExecuteAsync(async () =>{ await Task.Delay(100); throw new TimeoutException("模拟超时");}, ex =>{ // 自定义处理逻辑 Console.WriteLine($"自定义处理: {ex.GetType().Name}");}); 当你使用 Parallel 类进行循环并行化时,异常处理方式略有不同。一旦某个迭代抛出异常,整个并行循环会尽快停止,并将异常包装在 AggregateException 中:
try{ Parallel.For(0, 10, i => { if (i == 5) throw new InvalidOperationException($"第 {i} 次迭代出错!"); Console.WriteLine($"处理 {i}"); });}catch (AggregateException ae){ Console.WriteLine("Parallel 循环中发生异常:"); foreach (var ex in ae.InnerExceptions) { Console.WriteLine($" - {ex.Message}"); }} await 的任务使用 try-catch。Task.WhenAll 时,准备好处理 AggregateException。SafeExecuteAsync)。掌握 C#并行任务异常处理 是编写健壮异步程序的关键技能。通过本文介绍的方法,你可以有效捕获、记录并响应并行任务中的异常,避免程序意外崩溃。无论是使用 Task 还是 Parallel,只要遵循上述原则,就能实现可靠的 Parallel异常管理。
希望这篇教程能帮助你轻松驾驭C#中的并行异常处理!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129256.html