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

C#任务延续的条件执行(详解Task.ContinueWith在特定条件下运行后续操作)

在C#异步编程中,任务延续(Task Continuation)是一种非常强大的机制,它允许我们在一个任务完成后自动启动另一个任务。但有时候我们并不希望所有延续任务都无条件执行——比如只在前一个任务成功完成时才继续,或者只在发生异常时才执行错误处理逻辑。这就需要用到条件执行

本文将带你从零开始理解 C# 中如何使用 Task.ContinueWith 实现条件执行,即使你是编程小白也能轻松掌握!

C#任务延续的条件执行(详解Task.ContinueWith在特定条件下运行后续操作) C#任务延续 条件执行Task 异步编程C# Task.ContinueWith条件 第1张

什么是 Task.ContinueWith?

Task.ContinueWith 是 .NET 提供的一个方法,用于在当前任务完成后立即启动一个新的任务。它的基本语法如下:

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

上面的代码中,continuationTask 会在 originalTask 完成后自动执行。

为什么需要条件执行?

并非所有任务都总能成功完成。任务可能因为异常而失败,也可能被取消。如果我们不加判断地执行延续任务,可能会导致程序崩溃或逻辑错误。

例如:你有一个下载文件的任务,如果下载成功,你想解压它;如果下载失败,你想记录日志而不是尝试解压一个不存在的文件。这时候就需要根据任务状态有条件地执行延续任务

使用 TaskContinuationOptions 控制执行条件

C# 提供了 TaskContinuationOptions 枚举,让我们可以精确控制延续任务在什么情况下运行。常见的选项包括:

  • OnlyOnRanToCompletion:仅当前一个任务成功完成时执行
  • OnlyOnFaulted:仅当前一个任务抛出异常时执行
  • OnlyOnCanceled:仅当前一个任务被取消时执行
  • NotOnRanToCompletion:当前一个任务未成功完成时执行(即失败或取消)

示例:成功、失败、取消三种情况分别处理

Task<string> riskyTask = Task.Run(() => {    // 模拟可能失败的操作    if (DateTime.Now.Second % 3 == 0)        throw new InvalidOperationException("模拟异常!");    return "操作成功";});// 仅在成功时执行riskyTask.ContinueWith(t => {    Console.WriteLine($"✅ 成功: {t.Result}");}, TaskContinuationOptions.OnlyOnRanToCompletion);// 仅在失败时执行riskyTask.ContinueWith(t => {    Console.WriteLine($"❌ 失败: {t.Exception?.InnerExceptions[0].Message}");}, TaskContinuationOptions.OnlyOnFaulted);// 仅在取消时执行(本例中不会触发)riskyTask.ContinueWith(t => {    Console.WriteLine("⏸️ 任务被取消");}, TaskContinuationOptions.OnlyOnCanceled);// 等待任务完成(实际项目中建议使用 await)try {    riskyTask.Wait();} catch {    // 忽略异常,因为我们已经在 ContinueWith 中处理了}

通过这种方式,我们可以为不同结果编写不同的处理逻辑,使程序更加健壮。

现代推荐:使用 async/await 替代 ContinueWith

虽然 ContinueWith 功能强大,但在现代 C# 开发中,更推荐使用 asyncawait 来处理异步流程,因为它们更简洁、可读性更高,并且天然支持异常传播。

public async Task ProcessDataAsync(){    try    {        string result = await RiskyOperationAsync();        Console.WriteLine($"✅ 成功: {result}");    }    catch (OperationCanceledException)    {        Console.WriteLine("⏸️ 任务被取消");    }    catch (Exception ex)    {        Console.WriteLine($"❌ 失败: {ex.Message}");    }}private async Task<string> RiskyOperationAsync(){    await Task.Delay(100); // 模拟异步操作    if (DateTime.Now.Second % 3 == 0)        throw new InvalidOperationException("模拟异常!");    return "操作成功";}

不过,在某些高级场景(如并行任务协调、自定义调度器等),ContinueWith 仍然是不可替代的。因此,理解 C#任务延续 的条件执行机制依然非常重要。

总结

- 使用 TaskContinuationOptions 可以实现 条件执行Task

- 常见选项包括 OnlyOnRanToCompletionOnlyOnFaultedOnlyOnCanceled

- 虽然 async/await 是现代 异步编程C# 的首选,但掌握 Task.ContinueWith 对深入理解 Task.ContinueWith条件 执行逻辑很有帮助;

- 合理使用条件延续,可以让你的异步代码更安全、更可靠。

希望这篇教程能帮你轻松掌握 C# 中任务延续的条件执行!如果你觉得有用,欢迎分享给其他开发者。