ITPub博客

首页 > 数据库 > 数据库开发技术 > C# 异步编程技巧:Task 和 CancellationTokenSource 的妙用

C# 异步编程技巧:Task 和 CancellationTokenSource 的妙用

原创 数据库开发技术 作者:后端Q 时间:2024-12-31 00:00:00 0 删除 编辑



在现代软件开发中,异步编程已成为提高应用程序性能和响应性的关键技术。C# 提供了强大的异步编程模型,其中 Task 和 CancellationTokenSource 是两个核心组件。本文将探讨这两个组件的使用方法和技巧,以及它们在异步编程中的妙用。

Task:异步操作的基石 

Task 是 C# 中表示异步操作的对象。它允许你在后台线程上执行代码,而不会阻塞主线程。使用 async 和 await 关键字,你可以轻松地编写异步代码。

创建和使用 Task

创建一个 Task 非常简单,你可以使用 Task.Run 方法来启动一个后台任务:

Task.Run(() => {
    // 耗时操作
});

你也可以在异步方法中使用 await 来等待 Task 的完成:

public async Task DoSomethingAsync() {
    await Task.Run(() => {
        // 耗时操作
    });
}

CancellationTokenSource:优雅的取消机制 

CancellationTokenSource 是 C# 中用于实现异步操作取消的核心类。它允许你发送取消信号给正在执行的任务,使任务能够优雅地终止。

发起取消请求

使用 CancellationTokenSource 发起取消请求的基本步骤如下:

  1. 创建 CancellationTokenSource 并获取 CancellationToken。
  2. 将 CancellationToken 传递给可取消的任务。
  3. 发出取消请求(调用 Cancel 方法)。
  4. 处理取消:任务会检查 CancellationToken,并在取消时抛出 OperationCanceledException。

示例代码

using System;
using System.Threading;
using System.Threading.Tasks;

publicclassProgram {
    public static void Main() {
        usingvar cts = new CancellationTokenSource();
        var task = Task.Run(() => DoWork(cts.Token), cts.Token);
        // 发起取消请求
        cts.Cancel();
        try {
            task.Wait(); // 等待任务完成
        } catch (AggregateException ae) {
            foreach (var e in ae.InnerExceptions) {
                if (e is OperationCanceledException) {
                    Console.WriteLine("Task was cancelled.");
                } else {
                    Console.WriteLine("Task threw an exception: " + e.Message);
                }
            }
        }
    }

    public static void DoWork(CancellationToken token) {
        for (int i = 0; i < 10; i++) {
            token.ThrowIfCancellationRequested();
            Console.WriteLine($"Working... {i}");
            Thread.Sleep(500); // 模拟耗时操作
        }
        Console.WriteLine("Task completed.");
    }
}

在这个示例中,DoWork 方法会定期检查 CancellationToken,并在检测到取消请求时抛出 OperationCanceledException。

合并多个 CancellationToken

有时,一个任务可能需要响应多个取消请求。可以通过 CancellationTokenSource.CreateLinkedTokenSource 方法合并多个 CancellationToken:

CancellationTokenSource cts1 = new CancellationTokenSource();
CancellationTokenSource cts2 = new CancellationTokenSource();
CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token);
CancellationToken token = linkedCts.Token;
Task task = Task.Run(() => DoWork(token), token);
// 发出取消请求
cts1.Cancel(); // 或 cts2.Cancel();

注意事项

  • 定期检查取消状态:在任务内部定期调用 token.ThrowIfCancellationRequested() 或 token.IsCancellationRequested 来检测取消信号。
  • **处理 OperationCanceledException**:通常使用 try-catch 来捕获 OperationCanceledException,以确保任务取消后程序能正确处理。

总结 

Task 和 CancellationTokenSource 是 C# 异步编程中不可或缺的工具。它们不仅提供了异步执行的能力,还允许你灵活地控制任务的取消。掌握这些技巧,可以帮助你编写出更高效、更健壮的异步代码。


原文作者:后端Q;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    725976