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日

相关文章

  • .Net Core中使用Grpc的方法

    .NET Core中使用gRPC的方法 gRPC是一种高性能、开源的远程过程调用(RPC)框架,它可以在多种语言和平台之间进行通信。在.NET Core中,您可以使用gRPC来构建分布式应用程序。在本攻略中,我们将详细讲解.NET Core中使用gRPC的方法,并提供两个示例说明。 步骤一:创建gRPC服务 在.NET Core中,您可以使用Visual S…

    C# 2023年5月17日
    00
  • C#飞行棋小程序设计代码

    下面是关于C#飞行棋小程序设计代码的完整攻略。 一、项目介绍 本项目是一个基于C#语言开发的飞行棋小程序,主要实现了玩家与AI的对战,包括玩家与玩家的双人模式和玩家与AI的单人模式。玩家可以选择自己的棋子并掷骰子前进,并通过各种游戏道具获取优势,最后到达终点即可获胜。 二、技术实现 本项目基于Windows Forms应用程序开发,主要涉及到以下技术实现: …

    C# 2023年5月31日
    00
  • 浅析C# 中的类型系统(值类型和引用类型)

    浅析C#中的类型系统(值类型和引用类型) 在C#中,数据类型可以分为值类型和引用类型。这两种类型分别有不同的存储方式和操作方式。 值类型 值类型表示实际的数据值,通常直接放在变量的内存位置中。用于表示基本数据类型,如int、float、double等。还可以通过结构体定义,以及枚举类型。值类型的赋值是按值传递的。 示例1 以下示例展示了一些基本值类型的使用:…

    C# 2023年6月7日
    00
  • C# 对象持久化详解

    C# 对象持久化详解 什么是对象持久化 对象持久化是指将内存中的对象数据转换为持久化存储的数据,以便在程序关闭后仍然能够重新读取数据。这种方式常用于数据存储,包括关系数据库等。 C# 中的对象持久化 在 C# 中,我们可以使用多种方式实现对象持久化,最常用的方式是使用 Entity Framework 和 JSON 序列化。 使用 Entity Framew…

    C# 2023年5月31日
    00
  • c# 动态加载dll文件,并实现调用其中的方法(推荐)

    C# 动态加载 DLL 文件并实现调用其中的方法是一个在编写 C# 程序时常见的需求,下面将介绍如何实现此功能。 1. 加载 dll 文件 调用 DLL 文件中的方法,需要先将 DLL 加载到当前进程中。有两种方式可以加载 DLL 文件: 1.1. 使用 Assembly 类加载 DLL using System.Reflection; // 加载 mydl…

    C# 2023年6月7日
    00
  • C# Sqlite数据库的搭建及使用技巧

    C# Sqlite数据库的搭建及使用技巧 介绍 Sqlite是一款轻量级的开源数据库,适用于小型单机应用程序。C#作为一种强类型、面向对象的编程语言,与Sqlite的结合是一种不错的选择。本文将介绍如何在C#中搭建Sqlite数据库以及使用技巧,以便快速开发基于Sqlite的应用程序。 搭建Sqlite数据库 安装Sqlite 首先,需要从Sqlite官网下…

    C# 2023年6月1日
    00
  • 详解使用DotNet CLI创建自定义的WPF项目模板

    我来为你详细讲解使用DotNet CLI创建自定义的WPF项目模板的完整攻略。以下是具体步骤: 步骤一:创建WPF项目 首先,我们需要创建一个WPF项目。可以在Visual Studio中创建或者使用以下命令在终端中创建: dotnet new wpf -n <项目名称> 这样我们就创建了一个名为<项目名称>的WPF项目。 步骤二:创…

    C# 2023年6月7日
    00
  • C#语言使用gRPC、protobuf(Google Protocol Buffers)实现文件传输功能

    接下来我将为您详细讲解如何使用C#语言通过gRPC和protobuf实现文件传输功能。 1. gRPC和protobuf简介 1.1 gRPC gRPC是一种高性能、开源和通用的RPC框架,可以用于多种语言和平台。它基于HTTP/2协议设计,使用protobuf作为数据传输的格式。相比于传统的RESTful API和SOAP,gRPC有以下优势: 性能更高:…

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