运用示例简单讲解C#取消令牌CancellationTokenSource

针对你所提出的问题,我会给出逐步的解释和示例演示,来详细地讲解如何运用C#的取消令牌CancellationTokenSource。

什么是CancellationTokenSource?

CancellationTokenSource是一个用于协作取消多个任务的机制。它提供了一种向多个任务同时发出取消信号的方法。

在使用CancellationTokenSource之前,我们需要创建一个CancellationTokenSource实例。CancellationTokenSource实例包含一个CancellationToken(取消令牌),并与多个任务共享。当我们调用CancellationToken的Cancel方法时,与该CancellationTokenSource相关联的所有任务都会收到取消请求。

创建CancellationTokenSource

我们可以通过CancellationTokenSource的构造函数来创建CancellationTokenSource实例,如下所示:

var cts = new CancellationTokenSource();

取消令牌

当我们调用CancellationTokenSource实例的Cancel方法时,与该CancellationTokenSource相关联的所有任务都会收到取消请求,如下所示:

cts.Cancel();

取消令牌的注册

当我们创建任务时,我们可以将CancellationToken对象传递给任务。然后,任务可以在其长时间运行的操作的适当间隙中检查该令牌,以便在用户请求取消时退出长时间运行的操作。下面是一个示例:

public static void DoSomeWork(CancellationToken ct)
{
    // Do some work here.
    while (true)
    {
        // Check if cancellation is requested.
        if (ct.IsCancellationRequested)
        {
            break;
        }

        // Do some more work here.
    }
}

在上面的示例中,我们可以看到,我们使用了ct.IsCancellationRequested参数,来判断当前是否请求取消令牌。

如何运用CancellationTokenSource?

下面我们将给出两个示例,来演示如何运用CancellationTokenSource。

示例一:取消非托管资源的使用

我们假设我们创建了一个用于访问非托管资源的类UnmanagedResourceAccessor。该类的构造函数接受一个CancellationToken参数,以便在取消请求时释放资源。下面是示例代码:

public class UnmanagedResourceAccessor : IDisposable
{
    // The unmanaged resource we are accessing.
    private IntPtr _resource;

    // The token that determines if we are canceled or not.
    private CancellationToken _cancellationToken;

    // Constructor.
    public UnmanagedResourceAccessor(IntPtr resource, CancellationToken cancellationToken)
    {
        _resource = resource;
        _cancellationToken = cancellationToken;
    }

    // Release the unmanaged resource.
    private void ReleaseResource()
    {
        // Implement release logic here.
    }

    // Dispose the object.
    public void Dispose()
    {
        ReleaseResource();
    }
}

下面是一个使用UnmanagedResourceAccessor类的示例:

public void CancelableOperation()
{
    // Create a cancellation token source.
    using (var cancellationTokenSource = new CancellationTokenSource())
    {
        // Create an instance of our unmanaged resource accessor.
        var unmanagedResourceAccessor = new UnmanagedResourceAccessor(GetResourceHandle(), cancellationTokenSource.Token);

        try
        {
            // Do some work using the unmanaged resource accessor.
            // Possibly long running operation that needs to be cancelable.
        }
        catch (OperationCanceledException)
        {
            // The operation was canceled.
            // Clean up any resources used.
        }
        finally
        {
            // Dispose of the unmanaged resource accessor.
            unmanagedResourceAccessor.Dispose();
        }
    }
}

在上面的示例中,我们使用了using关键字来确保CancellationTokenSource及UnmanagedResourceAccessor类实例的正确释放。如果我们在DoSomeWork方法中检测到了取消请求,那么就可以使用OperationCanceledException来抛出并处理取消操作。

示例二:取消长时间运行的操作

下面是针对长时间运行的操作的示例代码:

public void CancelableLongRunningOperation(CancellationToken ct)
{
    var rnd = new Random();
    var counter = 0;
    while (!ct.IsCancellationRequested && counter < 10)
    {
        Console.WriteLine($"{counter}. Doing some work...");

        // Simulate long running operation.
        Thread.Sleep(rnd.Next(500, 2000));
        counter++;
    }

    if (ct.IsCancellationRequested)
    {
        Console.WriteLine("Canceled!");
    }
    else
    {
        Console.WriteLine("Finished!");
    }
}

上述示例中模拟了一个长时间运行的操作,并且在运行过程中,检查了取消令牌是否被请求,如果被请求,则退出循环并处理取消请求。

下面是怎么使用CancellationTokenSource及CancelableLongRunningOperation方法的示例代码:

public void RunCancelableLongRunningOperation()
{
    // Create a CancellationTokenSource.
    var cts = new CancellationTokenSource();
    var ct = cts.Token;

    // Do some work.
    var task = Task.Factory.StartNew(() => CancelableLongRunningOperation(ct), ct);

    // Wait for a key press, then cancel the operation.
    Console.WriteLine("Press any key to cancel.");
    Console.ReadKey();
    cts.Cancel();

    try
    {
        // Wait for task to complete or throw an exception.
        task.Wait(ct);
    }
    catch (AggregateException ex)
    {
        Console.WriteLine(ex.InnerException.Message);
    }
}

上面的代码中,我们首先创建了一个CancellationTokenSource实例,然后我们使用Task.Factory.StartNew方法附加了一个长时间运行的任务,然后等待用户按下按键以请求取消令牌。最后,我们用try-catch块来等待任务完成,或者在取消请求时抛出异常。

这就是如何运用CancellationTokenSource的示例攻略。希望我的回答能够对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:运用示例简单讲解C#取消令牌CancellationTokenSource - Python技术站

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

相关文章

  • C#查找对象在ArrayList中出现位置的方法

    Markdown格式说明: 标题使用#号进行标记 代码块使用“`标记开头和结尾 示例说明使用文本加代码块结合的方式 C#查找对象在ArrayList中出现位置的方法 在 C# 中,可以使用 ArrayList 类型来存储一些对象。有时候我们需要查找某个对象在 ArrayList 中出现的位置,这时候可以使用以下方法对 ArrayList 进行搜索: int…

    C# 2023年5月31日
    00
  • C# WINFORM自定义异常处理方法

    让我来详细讲解一下“C# WINFORM自定义异常处理方法”的完整攻略。 什么是异常处理 在编程过程中,由于各种原因,程序可能会产生错误,例如:用户输入错误、文件读写错误、网络连接错误等等。这些错误被称为异常。而异常处理就是程序在出现异常情况时进行的一系列操作。正确的异常处理能够增强程序的鲁棒性,使程序更加健壮。 异常处理的基本方式 在C# WINFORM中…

    C# 2023年5月15日
    00
  • Spring Boot源码实现StopWatch优雅统计耗时

    首先我们先来介绍一下StopWatch是什么。 StopWatch是Spring Framework中用来计时的工具类,其设计思想源于Commons-lang中的StopWatch。其主要功能是帮助我们在开发过程中进行代码耗时的统计,方便我们进行性能优化。StopWatch提供了一系列操作,例如开始计时、停止计时以及记录过程中每个计时点的时间等。 接下来,我…

    C# 2023年6月6日
    00
  • 详解PID控制器原理

    详解PID控制器原理 什么是PID控制器? PID控制器是一种常用的控制器,可以用于自动控制系统中。它的全称是Proportional-Integral-Derivative Controller(比例-积分-微分控制器),它主要根据误差信号调整控制量,从而稳定系统的输出。 PID控制器的组成 PID控制器由三部分组成: 比例控制器 比例控制器根据误差信号调…

    C# 2023年6月8日
    00
  • C# 9.0新特性——只初始化设置器

    当我们声明一个类时,经常需要为该类的字段或属性提供一个初始值,以确保在对象创建后这些值处于可用状态。在C# 9.0中,新特性“只初始化设置器”(init-only setters)允许我们在对象创建后,通过只读属性的方式对属性进行初始化。 什么是只初始化设置器 只初始化设置器(init-only setters)是C# 9.0中新出现的特性,只初始化设置器允…

    C# 2023年5月31日
    00
  • C# 串口通信

    这里浅说一下蓝牙与串口的区别:         蓝牙:连接以mac地址为主,显示名称可以更改,低功耗蓝牙还需要配置服务与特征(服务有读,写,可读可写区别) 特点:不同设备连接同一台蓝牙设备,mac地址与显示名称都是唯一的         串口:连接以端口名称为主,例如com1,com2,连接时需要配置参数较多 特点:不同设备接入同一个串口模块,显示的名称可能…

    C# 2023年5月5日
    00
  • C#格式化数字字符串的方法

    下面我将为你详细讲解如何在C#中格式化数字字符串的方法。 使用ToString方法格式化数字字符串 在C#中,我们可以使用ToString方法来将数字格式化为字符串。该方法有许多重载,可以用于格式化不同类型的数字,下面是一些常见的用法。 1. 格式化整数 对于整数类型,可以使用ToString方法的重载形式来指定需要的格式,例如: int num = 123…

    C# 2023年5月15日
    00
  • C#实现跨线程操作控件方法

    C# 实现跨线程操作控件方法是在多线程编程中经常使用的技术。一般情况下,在单独的线程中更新控件的属性或执行某个方法是无法进行的,这时候我们就需要使用一些技术手段来使得控件可以被更好的操纵。下面是实现跨线程操作控件方法的完整攻略: 1.4 异步委托 (Async Method) 异步委托可以使本来需要占用线程等待未知的情况变得可以继续执行,即异步执行。 函数定…

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