zoukankan      html  css  js  c++  java
  • C#取消令牌CancellationTokenSource

    net core首推异步编程,到处可以看到Task的影子,而CancellationToken正好是异步Task的一个控制器!

    在 .NET Core 中使用异步编程已经很普遍了, 你在项目中随处可见 async 和 await,它简化了异步操作,允许开发人员,使用同步的方式编写异步代码,你会发现在大部分的异步方法中,都提供了CancellationToken参数,本文主要介绍下 CancellationTokenSource 和 CancellationToken在异步任务中的使用。

    手动取消任务

    创建一个 CancellationTokenSource,然后调用异步方法时,传入 CancellationToken,它是一个轻量级对象,可以通知请求是否已取消,我们可以手动调用 cts.Cancel() 来取消任务,为了方面演示,这里我有用到局部方法

    static async Task Main(string[] args)
    {
       async Task Execute(CancellationToken token)
       {
           await Task.Delay(3000, token);
           Console.WriteLine("Executed");
       } 
    
       CancellationTokenSource cts = new CancellationTokenSource();  
    
       _ = Execute(cts.Token);
    
       // 手动取消任务
       cts.Cancel();  
    
       Console.ReadKey();
    }   

    定时取消任务

    创建 CancellationTokenSource 的时候,可以传入时间(毫秒或者Timespan), 通过它我们可以在等待一段时间后,自动取消任务。

     CancellationTokenSource cts = new CancellationTokenSource(1000);  
    
    _ = Execute(cts.Token);  
    
    Console.ReadKey();

    我们也可以调用 cts.CancelAfter(1000), 它会在1s后取消任务

    cts.CancelAfter(1000);

    CancellationToken 注册回调

    我们可以调用 Register()方法,注册Token取消的回调,参数需要传入 Action 委托。

     CancellationTokenSource cts = new CancellationTokenSource(1000);
    
    cts.Token.Register(() => Console.WriteLine("任务已取消!"));
    
    // 开始异步任务
    _ = Execute(cts.Token);    
    
    Console.ReadKey();

    Register() 注册回调后,返回一个 CancellationTokenRegistration 对象,同样的,你可以在回调函数执行前,移除注册回调,就像这样:

    cts.Token.Register(() => Console.WriteLine("任务已取消!")).Unregister();

    在 HttpClient 中使用

    同样,你可以在 HttpClient 中使用传入 CancellationToken (或者使用HttpClient的Timeout属性),超时后,它会抛出一个 TaskCanceledException 的异常:

     CancellationTokenSource cts = new CancellationTokenSource(10);  
    
    _ = await new HttpClient().GetAsync("https://www.youtube.com/",cts.Token); 
    
    Console.ReadKey();
  • 相关阅读:
    询问js代码
    嵌套查询sql语句例子
    简单的添加更新语句 一条语句实现
    xp序列号
    字符串处理类代码
    上传图片类代码
    关于IE9中jquery ajax提交无法发送cookie的解决方案
    asp.net mvc3分页代码
    System.Timers.Timer在asp.net中的使用方法
    SQL2005连接远程连接配置
  • 原文地址:https://www.cnblogs.com/netlock/p/15184236.html
Copyright © 2011-2022 走看看