C# CancellationToken和CancellationTokenSource的用法详解

C# CancellationToken 和 CancellationTokenSource 用法详解

CancellationToken 和 CancellationTokenSource 是 C# 中用于取消异步操作的机制。本篇攻略将详细讲解这两个类的用法。

CancellationTokenSource

CancellationTokenSource 类用于创建用于取消操作的标记(CancellationToken)。可以使用 CancellationTokenSource.Cancel() 方法来请求取消操作。下面是 CancellationTokenSource 的示例:

using System;
using System.Threading;
namespace CancellationTokenSourceExample
{
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            CancellationToken token = cancellationTokenSource.Token;

            // 这里模拟一个异步操作
            ThreadPool.QueueUserWorkItem(state =>
            {
                Console.WriteLine("异步操作开始执行,按任意键取消操作。");
                for (int i = 0; i < 10; i++)
                {
                    // 检查操作是否被取消了
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("操作已经被取消了。");
                        return;
                    }
                    Console.WriteLine(i);
                    Thread.Sleep(1000);
                }
            });

            Console.ReadKey();
            cancellationTokenSource.Cancel();
            Console.WriteLine("请求取消异步操作");
            Console.ReadKey();
        }
    }
}

上面的示例中,我们创建了一个 CancellationTokenSource 对象,然后通过它的 Token 属性获取到 CancellationToken 对象。然后我们将一个异步操作放入线程池中,并在其中检查 CancellationToken 是否被取消。

运行上面的代码,在异步操作开始执行时按任意键即可取消操作。

CancellationToken

CancellationToken 类用于检查是否应该取消异步操作。当 CancellationTokenSource 对象将其 CancellationToken.Tokens 属性暴露给多个任务时,每个任务都会检查该标记以确定它是否应取消。下面是 CancellationToken 的示例:

using System;
using System.Threading;
namespace CancellationTokenExample
{
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            CancellationToken token = cancellationTokenSource.Token;

            ThreadPool.QueueUserWorkItem(state =>
            {
                Console.WriteLine("异步操作开始执行");
                for (int i = 0; i < 10; i++)
                {
                    // 检查操作是否被取消了
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("操作已经被取消了。");
                        return;
                    }
                    Console.WriteLine(i);
                    Thread.Sleep(1000);
                }
                Console.WriteLine("异步操作已经完成");
            }, token);

            Console.ReadKey();
            cancellationTokenSource.Cancel();
            Console.WriteLine("请求取消异步操作");
            Console.ReadKey();
        }
    }
}

上面的示例中,我们通过 CancellationToken 类来检查异步操作是否应该被取消。运行上面的代码,在异步操作开始之后按任意键即可取消操作,否则操作将继续执行。

总结

通过我们对 CancellationToken 和 CancellationTokenSource 的讲解,我们可以看出二者的配合使用可以很好的实现异步操作的取消。在异步操作中使用 CancellationToken 和 CancellationTokenSource 不仅可以在异步操作开始执行后随时取消操作,而且提高了应用程序的响应性,让应用程序更加友好。

介于 CancellationToken 的使用场景非常广泛,具体的实现方式也需要根据不同的业务场景进行适度的调整。以上示例仅作为参考使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# CancellationToken和CancellationTokenSource的用法详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#实现将数组内元素打乱顺序的方法

    当我们需要对一个数组进行随机排序时,可以使用 Fisher-Yates 随机置换算法。以下是使用C#实现将数组内元素打乱顺序的方法的攻略: 步骤一:创建待打乱的数组 首先,创建一个具有一定数量元素的数组(可以根据自己的需要指定)。 int[] arr = {1, 2, 3, 4, 5}; 步骤二:初始化随机数生成器 使用C#中的Random类创建对象,用以产…

    C# 2023年6月7日
    00
  • C#算法之大牛生小牛的问题高效解决方法

    C#算法之大牛生小牛的问题高效解决方法 问题描述 题目来源于 LeetCode,现在有一只大牛和一只小牛,它们的初始体重分别为 $x$ 和 $y$,每年它们的体重都会增加固定的比例(比例为 $p$),求当小牛的体重超过大牛的体重时,需要多少年。 解题思路 考虑使用循环解决。 每年大牛的体重增加 $p$%,小牛的体重增加 $2p$%,那么循环条件可以设为小牛体…

    C# 2023年6月7日
    00
  • 部署ASP.NET Core程序到Linux系统

    部署ASP.NET Core程序到Linux系统攻略 ASP.NET Core是一个跨平台的Web应用程序框架,可以在Windows、Linux和macOS等操作系统上运行。本文将介绍如何将ASP.NET Core程序部署到Linux系统上。 准备工作 在开始之前,需要完成以下准备工作: 安装.NET Core SDK。 安装Linux系统。 步骤 步骤1:…

    C# 2023年5月17日
    00
  • 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现

    深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 什么是面向对象编程(OOB) 面向对象编程是一种常见的编程范式,也是JavaScript编程中一个重要的概念。它将程序中的数据和方法组织为对象,使得程序具有更好的可读性、可复用性和可维护性。 面向对象编程中的关键点包括:封装、继承和多态。封装是指将数据和方法封装到一个对象中,并…

    C# 2023年6月8日
    00
  • C#8.0中的索引与范围功能介绍

    C#8.0中的索引与范围功能介绍 什么是索引 索引是一个整数值,用于表示集合中元素的位置。在C#8.0中,可以用^符号来引入反向索引。例如,^3表示倒数第三个元素。使用[]符号可以访问特定位置的元素。 下面是示例代码: int[] nums = { 1, 2, 3, 4, 5 }; Console.WriteLine(nums[^1]); // 输出 5 C…

    C# 2023年6月8日
    00
  • 浅谈C# 中的可空值类型 null

    浅谈C# 中的可空值类型 null 在C#中,null代表一个空引用或不存在的对象。当我们调用一个没有赋值的对象时,就会出现空引用异常。为了避免这种情况,C#提供了可空值类型。 可空值类型 可空值类型是一种用于表示一个值类型可能为null的数据类型。比如它可以声明一个int类型的变量,并赋值为null。在可空值类型中,可以赋值为null的值类型例如 int、…

    C# 2023年6月1日
    00
  • C#线程池ThreadPool用法简介

    C#线程池ThreadPool用法简介 简介 C# 线程池(ThreadPool)是 .NET Framework 的一个重要组件,它可以管理和调度运行于多个工作线程上的任务,这样就可以避免频繁地创建和销毁线程。 采用线程池的方式可以优化应用程序的性能,同时降低系统的负担。 使用 使用线程池需要使用 System.Threading 命名空间中的 Threa…

    C# 2023年6月6日
    00
  • C#中dynamic关键字的正确用法(推荐)

    下面是“C#中dynamic关键字的正确用法(推荐)”的详细攻略: 什么是dynamic关键字 C#中的dynamic关键字,是用于在运行时(而非编译时)进行类型检查和绑定,它可以让我们代码更加灵活、简洁、易读。 C#中的dynamic和var关键字的区别在于,var关键字是在编译时进行类型判断并声明变量类型,在编译后变量类型就确定了,而dynamic关键字…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部