CancellationTokenSource的使用

CancellationTokenSource 是 .NET 中用于生成取消标记 (CancellationToken) 的类之一。它允许您创建一个可用于请求取消操作的取消标记,以便您的应用程序能够响应取消请求。

以下是关于 CancellationTokenSource 的一些关键信息:

  1. 创建 CancellationTokenSource 对象: 要创建一个 CancellationTokenSource 对象,只需使用 new 关键字来实例化它,如下所示:

    CancellationTokenSource cts = new CancellationTokenSource();
    
  2. 生成取消标记: CancellationTokenSource 对象通过其 Token 属性生成一个取消标记。这个标记可以传递给需要检查取消请求的方法,以便它们可以在取消请求时停止执行。

    CancellationToken token = cts.Token;
    
  3. 请求取消操作: 当您想要取消某个操作时,可以调用 CancellationTokenSourceCancel 方法,如下所示:

    cts.Cancel();
    

    这将导致与 CancellationToken 关联的操作抛出 OperationCanceledException,表明操作已被取消。

  4. 取消多个操作: 您可以使用同一个 CancellationTokenSource 来取消多个操作。只需将同一个取消标记传递给这些操作,然后在取消请求时调用 Cancel 方法即可。

  5. 检查取消请求: 在执行可能需要取消的操作时,通常会在操作的主要执行代码中多次检查取消标记,以查看是否已请求取消。这可以通过 token.IsCancellationRequested 属性来完成。

    if (token.IsCancellationRequested)
    {
        // 执行取消操作
    }
    
  6. 释放资源: 当不再需要取消标记时,应调用 CancellationTokenSourceDispose 方法来释放资源。这是很重要的,特别是在长时间运行的应用程序中,以确保不会发生资源泄漏。

    cts.Dispose();
    

CancellationTokenSource 可用于多线程应用程序和异步操作中,使您能够安全地取消执行中的操作,以提高应用程序的健壮性和可靠性。

以下是一个简单的示例,演示如何使用 CancellationTokenSource 来取消一个正在运行的任务。在这个示例中,我们将创建一个可以取消的计数器任务,以便在需要时停止计数。

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

class Program
{
    static async Task Main(string[] args)
    {
        // 创建 CancellationTokenSource 对象
        var cts = new CancellationTokenSource();

        // 获取取消标记
        CancellationToken token = cts.Token;

        // 启动一个计数器任务
        var task = StartCounterAsync(token);

        Console.WriteLine("按下 Enter 键来取消计数器任务...");
        Console.ReadLine();

        // 请求取消任务
        cts.Cancel();

        try
        {
            // 等待任务完成(如果已经完成则不等待)
            await task;
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("任务已取消.");
        }
    }

    static async Task StartCounterAsync(CancellationToken token)
    {
        try
        {
            for (int i = 0; i < 100; i++)
            {
                // 检查取消请求
                token.ThrowIfCancellationRequested();

                Console.WriteLine($"计数: {i}");
                await Task.Delay(1000); // 模拟一秒钟的工作
            }
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("计数器任务已取消.");
        }
    }
}

在这个示例中,我们创建了一个 CancellationTokenSource 对象 cts 和与之关联的取消标记 token。然后,我们启动了一个异步任务 StartCounterAsync,它会计数并在取消请求时抛出 OperationCanceledException

Main 方法中,我们等待用户按下 Enter 键来取消任务。一旦取消被请求,我们调用 cts.Cancel() 来请求任务取消。然后,我们等待任务完成,如果任务已取消,将捕获 OperationCanceledException 并显示相应的消息。

这个示例展示了如何使用 CancellationTokenSource 和取消标记来控制异步任务的取消。这对于需要响应用户操作或其他外部事件来取消操作的情况非常有用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CancellationTokenSource 是用于取消异步操作的一种机制,它可以与 CancellationToken 一起使用。以下是使用 CancellationTokenSource 的基本步骤: 1. 创建 CancellationTokenSource 对象。 2. 将 CancellationTokenSource.Token 传递给异步操作的方法,使其可以监视取消请求。 3. 在需要取消异步操作时,调用 CancellationTokenSource.Cancel() 方法。 4. 在异步操作的代码中,定期检查 CancellationToken.IsCancellationRequested 属性,以判断是否需要取消操作。 以下是一个简单的示例,演示如何使用 CancellationTokenSource: ```csharp public async Task DoAsyncOperation(CancellationToken cancellationToken) { // 模拟异步操作 await Task.Delay(5000, cancellationToken); // 检查取消标志 if (cancellationToken.IsCancellationRequested) { Console.WriteLine("异步操作已取消。"); return; } Console.WriteLine("异步操作已完成。"); } // 使用 CancellationTokenSource 取消异步操作 public async Task CancelAsyncOperation() { using (var cts = new CancellationTokenSource()) { var task = DoAsyncOperation(cts.Token); // 等待一段时间后取消异步操作 await Task.Delay(2000); cts.Cancel(); try { await task; } catch (OperationCanceledException) { Console.WriteLine("异步操作已取消。"); } } } ``` 在上面的代码中,我们首先创建了一个 CancellationTokenSource 对象,并将其传递给 DoAsyncOperation() 方法。然后,我们等待一段时间后调用 CancellationTokenSource.Cancel() 方法来取消异步操作。最后,我们使用 try/catch 块捕获 OperationCanceledException 异常,以处理取消操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值