当前位置:首页 > C# > 正文

掌握C#并行任务的延续机制(ContinueWith用法详解)

在现代C#开发中,异步编程并行任务已成为提升程序性能与响应能力的关键技术。其中,Task.ContinueWith 方法是处理任务完成后执行后续逻辑的重要工具。本文将从零开始,详细讲解 ContinueWith 的基本用法、常见场景及注意事项,帮助初学者轻松上手。

掌握C#并行任务的延续机制(ContinueWith用法详解) C#并行任务  ContinueWith用法 任务延续 异步编程 第1张

什么是 ContinueWith?

ContinueWithSystem.Threading.Tasks.Task 类中的一个方法,用于在当前任务完成(无论成功、失败或取消)后,自动启动一个新的任务。它实现了“任务链”的概念,非常适合构建复杂的异步工作流。

使用 ContinueWith 可以避免回调地狱(Callback Hell),让代码更清晰、可维护性更强。

基础用法示例

下面是一个最简单的 ContinueWith 示例:

using System;using System.Threading.Tasks;class Program{    static void Main()    {        Task task1 = Task.Run(() =>        {            Console.WriteLine("任务1正在执行...");            // 模拟耗时操作            Task.Delay(1000).Wait();            Console.WriteLine("任务1完成!");        });        Task task2 = task1.ContinueWith(prevTask =>        {            Console.WriteLine("任务2在任务1完成后执行!");        });        // 等待所有任务完成        task2.Wait();        Console.WriteLine("全部完成!");    }}

运行结果:

任务1正在执行...任务1完成!任务2在任务1完成后执行!全部完成!

处理任务结果与异常

如果前一个任务返回了结果(即 Task<TResult>),你可以在 ContinueWith 中访问它:

Task<int> computeTask = Task.Run(() =>{    return 42;});Task resultTask = computeTask.ContinueWith(prev =>{    Console.WriteLine($"前一个任务的结果是: {prev.Result}");});resultTask.Wait();

此外,你还可以通过检查 prevTask.IsFaultedprevTask.Exception 来处理异常:

Task faultyTask = Task.Run(() =>{    throw new InvalidOperationException("出错了!");});Task handleException = faultyTask.ContinueWith(prev =>{    if (prev.IsFaulted)    {        Console.WriteLine($"捕获异常: {prev.Exception?.InnerException?.Message}");    }}, TaskContinuationOptions.OnlyOnFaulted);handleException.Wait();

使用 TaskContinuationOptions 控制执行条件

你可以通过 TaskContinuationOptions 枚举来指定 ContinueWith 在什么情况下执行:

  • OnlyOnRanToCompletion:仅当前任务成功完成时执行
  • OnlyOnFaulted:仅当前任务抛出异常时执行
  • OnlyOnCanceled:仅当前任务被取消时执行
  • ExecuteSynchronously:同步执行延续任务(慎用)

替代方案:async/await 更推荐

虽然 ContinueWith 功能强大,但在 C# 5.0 之后,官方更推荐使用 async/await 语法来实现类似逻辑,因为其代码更简洁、易读:

static async Task Main(){    try    {        int result = await Task.Run(() => 42);        Console.WriteLine($"结果: {result}");    }    catch (Exception ex)    {        Console.WriteLine($"错误: {ex.Message}");    }}

不过,在某些高级场景(如动态任务链、自定义调度器等)中,ContinueWith 仍有其独特价值。

总结

通过本文,你已经掌握了 C# 中 并行任务的延续(ContinueWith)的基本用法、异常处理、执行条件控制等内容。记住,ContinueWith异步编程 工具箱中的重要一员,但日常开发中优先考虑 async/await 会让代码更优雅。

希望这篇教程能帮助你深入理解 C#并行任务任务延续 的核心概念。动手实践一下吧!