Task中的取消功能:使用的是CacellationTokenSoure解决多任务中协作取消和超时取消方法

本文详细介绍了在C#中如何使用CancellationTokenSource进行Task任务的取消与判断,包括基本的取消操作、注册取消后的清理工作以及设置任务的延时自动取消。通过具体的代码示例,展示了如何在不同的场景下实现任务的灵活控制。
摘要由CSDN通过智能技术生成
//【1】Task任务的取消和判断
static void Method8()
{
    //创建取消信号源对象
    CancellationTokenSource cts = new CancellationTokenSource();
    Task task = Task.Factory.StartNew(() =>
      {
          while (!cts.IsCancellationRequested)//判断任务是否被取消
          {
              Thread.Sleep(200);

              Console.WriteLine($"子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
          }
      }, cts.Token);

    //我们在这个地方模拟一个事件产生
    Thread.Sleep(2000);
    cts.Cancel();//取消任务,只要传递这样一个信号就可以
}

//【2】Task任务取消:同时我们也希望做一些清理的工作,也就是取消这个动作会触发一个任务。
static void Method9()
{
    CancellationTokenSource cts = new CancellationTokenSource();
    Task task = Task.Factory.StartNew(() =>
    {
        while (!cts.IsCancellationRequested)
        {
            Thread.Sleep(500);

            Console.WriteLine($"子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
        }
    }, cts.Token);

    //注册一个委托:这个委托将在任务取消的时候调用
    cts.Token.Register(() =>
    {
        //在这个地方可以编写自己要处理的逻辑...
        Console.WriteLine("任务取消,开始清理工作......");
        Thread.Sleep(2000);
        Console.WriteLine("任务取消,清理工作结束......");
    });

    //这个地方肯定是有其他的逻辑来控制取消
    Thread.Sleep(3000);//模拟其他的耗时工作
    cts.Cancel();//取消任务
}
//【3】Task任务延时自动取消:比如我们请求一个远程接口,如果长时间没有返回数据,我们可以做一个时间限制,超时可以取消任务(比如微信红包退回)
static void Method10()
{
    CancellationTokenSource cts = new CancellationTokenSource();
    // CancellationTokenSource cts = new CancellationTokenSource(3000);
    Task task = Task.Factory.StartNew(() =>
    {
        while (!cts.IsCancellationRequested)
        {
            Thread.Sleep(300);

            Console.WriteLine($"子线程Id={Thread.CurrentThread.ManagedThreadId}  {DateTime.Now.ToLongTimeString()}");
        }
    }, cts.Token);

    //注册一个委托:这个委托将在任务取消的时候调用
    cts.Token.Register(() =>
    {
        //在这个地方可以编写自己要处理的逻辑...
        Console.WriteLine("任务取消,开始清理工作......");
        Thread.Sleep(2000);
        Console.WriteLine("任务取消,清理工作结束......");
    });


    cts.CancelAfter(3000); //3秒后自动取消
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值