首页 > 编程语言 >C#中 CancellationTokenSource的妙用

C#中 CancellationTokenSource的妙用

时间:2024-12-21 09:21:21浏览次数:9  
标签:CancellationToken Task Console cts C# CancellationTokenSource 妙用 token

在.NET中,CancellationTokenSourceCancellationTokenTask是处理异步操作和取消任务的重要工具。本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。


CancellationTokenSource

CancellationTokenSource 是一个取消操作的触发器。它用于生成和管理CancellationToken,并控制取消信号的发出。

常用属性和方法
  • Token: 返回一个与此源关联的CancellationToken
  • Cancel(): 触发取消操作。
  • CancelAfter(milliseconds): 指定时间后触发取消操作。
  • Dispose(): 释放资源。
示例
var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task.Run(() => {
    for (int i = 0; i < 10; i++)
    {
        if (token.IsCancellationRequested)
        {
            Console.WriteLine("Task canceled");
            break;
        }
        Console.WriteLine($"Task running: {i}");
        Thread.Sleep(500);
    }
});

Thread.Sleep(2000);
cts.Cancel();

CancellationToken

CancellationToken 是用于传播取消请求的轻量级结构。它由CancellationTokenSource生成。

常用属性和方法
  • IsCancellationRequested: 是否收到取消请求。
  • ThrowIfCancellationRequested(): 如果已请求取消,抛出OperationCanceledException
  • Register(Action): 注册一个取消时触发的回调。
示例
var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task.Run(() => {
    token.Register(() => Console.WriteLine("Cancellation registered"));

    try
    {
        for (int i = 0; i < 10; i++)
        {
            token.ThrowIfCancellationRequested();
            Console.WriteLine($"Task running: {i}");
            Thread.Sleep(500);
        }
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("Task was canceled");
    }
});

Thread.Sleep(2000);
cts.Cancel();

Task与CancellationToken

Task 是.NET中的异步操作单元。结合CancellationToken可以在任务运行时取消它。

示例:取消任务
var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task task = Task.Run(() => {
    for (int i = 0; i < 10; i++)
    {
        if (token.IsCancellationRequested)
        {
            Console.WriteLine("Task canceled");
            break;
        }
        Console.WriteLine($"Task running: {i}");
        Thread.Sleep(500);
    }
}, token);

Thread.Sleep(2000);
cts.Cancel();

try
{
    task.Wait();
}
catch (AggregateException ex)
{
    foreach (var inner in ex.InnerExceptions)
    {
        if (inner is TaskCanceledException)
        {
            Console.WriteLine("Task cancellation exception caught");
        }
    }
}
示例:带超时的任务
var cts = new CancellationTokenSource(3000); // 3秒后自动取消
CancellationToken token = cts.Token;

Task.Run(() => {
    try
    {
        for (int i = 0; i < 10; i++)
        {
            token.ThrowIfCancellationRequested();
            Console.WriteLine($"Task running: {i}");
            Thread.Sleep(1000);
        }
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("Task canceled due to timeout");
    }
});

小结

  1. 使用CancellationTokenSource来控制取消。
  2. 通过CancellationToken将取消信号传递给任务或方法。
  3. 任务中可以通过ThrowIfCancellationRequested或检查IsCancellationRequested响应取消请求。
  4. 合理使用Register可以处理取消时的回调逻辑。

通过灵活运用这些工具,你可以编写更高效、可控的异步程序。

标签:CancellationToken,Task,Console,cts,C#,CancellationTokenSource,妙用,token
From: https://www.cnblogs.com/chenyishi/p/18620273

相关文章

  • 你有使用过grid-template-columns属性吗?说说它的用途
    grid-template-columns属性的用途grid-template-columns属性在前端开发中非常有用,它主要用于CSS的Grid布局中,定义网格的列数和每列的大小。以下是对其用途的详细解释:定义列数和列宽:通过grid-template-columns属性,开发者可以明确指定网格布局中的列数以及每列的宽度。例如,可以......
  • 你有使用过HBuilder吗?你喜欢它还是vs code?为什么?
    HBuilder和VSCode都是流行的前端开发环境,它们各自有自己的特点和优势。以下是对两者的简要比较和个人观点:HBuilder:集成性:HBuilder是一个更为集成的开发环境,特别是对于使用DCloud(数字天堂)相关技术和框架(如uni-app)的开发者来说,它提供了很多内置的工具和功能,可以大大简化开发流程......
  • 说说在Grid布局中grid-template-columns与grid-template-row中auto的解释
    在CSSGrid布局中,grid-template-columns和grid-template-rows属性用于定义网格的列和行的尺寸。在这两个属性中,auto关键字有着特殊的含义。grid-template-columns和grid-template-rows中的auto当你在grid-template-columns或grid-template-rows中使用auto时,它表示......
  • 你有使用过flood-color属性吗?说说它的用途
    flood-color属性的用途在前端开发中,flood-color属性主要与SVG(可缩放矢量图形)滤镜元素一起使用,用于指定滤镜效果中使用的颜色。以下是关于flood-color属性用途的详细解释:填充颜色:flood-color属性用于设置滤镜基元子区域的填充颜色。在SVG中,当使用某些滤镜效果(如feFlood)时,该属性......
  • 你有使用过lighting-color属性吗?说说它的用途
    lighting-color属性的用途在前端开发中,lighting-color属性是一个相对专业且具体的属性,它主要与SVG(可缩放矢量图形)滤镜效果相关。以下是关于lighting-color属性的详细用途说明:定义光源颜色:lighting-color属性用于定义照明滤镜基元的光源颜色。在SVG中,当使用<feDiffuseLighting>......
  • 你有使用过outline-color属性吗?说说它的用途
    outline-color属性的用途及实践在前端开发中,outline-color属性是CSS中outline属性的一部分,专门用于设置元素外边框(轮廓线)的颜色。outline属性作为一个简写属性,允许开发者在一个声明中同时设置轮廓的颜色(outline-color)、样式(outline-style)和宽度(outline-width)。以下是关于outline-......
  • 只谈C++11新特性 - nullptr
    nullptr在C++11标准中,引入了nullptr关键字,用来表示空指针。这是对原有NULL的重要改进,提供了更强的类型安全性,并避免了一些常见的编程错误。1.nullptr的特点nullptr是一种新类型std::nullptr_t的常量,用于表示空指针。与NULL不同,nullptr具有明确的指针类型......
  • v-bind操作class
    v-bind:class是Vue的指令之一,它用于绑定一个或多个类到元素上。它可以接受多种类型的值,包括字符串、对象和数组。字符串方式可以直接将一个字符串作为v-bind:class的值,此时该字符串会作为类名直接应用到元素上。<divv-bind:class="'class1'">Hello,World!</div>对象方......
  • 文件包含tomato靶机通关和文件上传hackme靶机通关
    文件包含tomato靶机通关靶机地址:192.168.152.152注:靶机打开后在kali中扫描一下就能得到打开网站第一步信息收集将网址放到dirb中扫描一下得到了三个目录我们挨个访问一下第一个是主目录第二个是主页面第三个报错第二步我们在主目录页面继续访问......
  • 【Rust自学】4.5. 切片(Slice)
    4.5.0.写在正文之前这是第四章的最后一篇文章了,在这里也顺便对这章做一个总结:所有权、借用和切片的概念确保Rust程序在编译时的内存安全。Rust语言让程序员能够以与其他系统编程语言相同的方式控制内存使用情况,但是当数据所有者超出范围时,让数据所有者自动清理该数据......