C# 取消异步操作

一、经常使用的方式

1、首先构建一个CancellationTokenSource实例

var cts=new CancellationTokenSource();

2、取消任务

cts.Cancel();

3、再构建一个CancellationToken实例

CancellationToken token = cts.Token;

4、token.IsCancellationRequested属性

说明是否请求取消任务。如果该属性为true,只保证已请求取消。

5、使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的)。而CancellationTokenSource则是外部对Task的控制,如取消、定时取消。

定时取消:

一个任务超过了我们所设定的时间然后自动取消该任务的执行。如下代码所示

 var cancelTokenSource = new CancellationTokenSource(3000);

除了构造函数,我们还可以使用另外一种方式实现定时取消,如下代码所示

cancelTokenSource.CancelAfter(3000);

运行起来效果是一样的,3秒钟定时取消。

二、取消一个异步操作的理论依据

一些.NET异步方法允许你请求终止执行。System.Threading.Tasks命名空间中有2个类是为此目的而设计的:CancellationToken和CancellationTokenSource。

1.CancellationToken对象包含一个任务是否应被取消的信息;

2.拥有CancellationToken对象的任务需要定期检查其令牌(token)状态。

如果CancellationToken对象的IsCancellationRequested属性为true,任务需停止其操作并返回。

3.CancellationToken是不可逆的,并且只能是使用一次

也就是说,一旦IsCancellationRequested属性被设置为true,就不能更改了。

 

4.CancellationTokenSource的对象创建可分配给不同任务的CancellationToken对象。

任何持有CancellationTokenSource的对象都可以调用其Cancel方法,这会将CancellationToken的IsCancellationRequested属性设置为true。

注意:CancellationTokenSource和CancellationToken是协同的,实现取消操作。调用CancellationTokenSource的Cancel时,它本身并不会执行取消任务操作,而是会将CancellationToken的IsCancellationRequested属性设置为true。

三、代码演示

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
   static void Main()
   {
      CancellationTokenSource cts = new CancellationTokenSource();
      CancellationToken token = cts.Token;

      MyClass mc = new MyClass();
      //这个异步任务 和 下面的代码并行运行(同一时间内,既运行这个任务,又运行下面代码)
      Task t = mc.RunAsync( token );

      Thread.Sleep(3000);                            // Wait 3 seconds.
      //请求取消任务(会将CancellationToken的IsCancellationRequested属性设置为true)
      cts.Cancel();                                    //cancel the operation.

      //等待任务t完成,才继续执行后续代码
      t.Wait();
      Console.WriteLine( "Was Cancelled: {0}", token.IsCancellationRequested );

      Console.Read();
   }
}

class MyClass
{
   public async Task RunAsync( CancellationToken ct )
   {
      //定期检查其令牌(token)状态
      if ( ct.IsCancellationRequested )
         return;
      //执行方法(当接收到CycleMethod方法返回的时候,该任务完成)
      await Task.Run( () => CycleMethod( ct ), ct );
   }

   void CycleMethod( CancellationToken ct )
   {
      Console.WriteLine( "Starting CycleMethod" );
      const int max = 5;
      for ( int i=0; i < max; i++ )
      {
         //定期检查其令牌(token)状态,如果为true--直接返回
         if ( ct.IsCancellationRequested )               // Monitor the CancellationToken.
            return;
         Thread.Sleep( 1000 );
         Console.WriteLine( " {0} of {1} iterations completed", i + 1, max );
      }
   }
}

允许结果显示:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要学好 C#异步编程,以下是一些建议: 1. 理解异步编程的概念:异步编程是一种并发编程的方式,可以提高程序的性能和响应能力。了解异步编程的基本原理和概念,包括异步方法、异步委托、任务等。 2. 使用 async 和 await 关键字:C# 提供了 async 和 await 关键字,用于简化异步编程。学习如何使用这些关键字来定义和调用异步方法,以及如何处理异步操作的结果。 3. 掌握 Task 和 Task<T> 类:Task 是 C# 中用于表示异步操作的类,Task<T> 则是带有返回值的异步操作类。了解如何创建、启动和等待任务,以及如何处理任务的结果和异常。 4. 熟悉异步编程模式(APM)和任务并行库(TPL):C# 提供了 APM 和 TPL 两种常用的异步编程模式。学习如何使用 BeginXXX 和 EndXXX 方法来实现 APM,以及如何使用 Parallel 类和并行 LINQ(PLINQ)来实现 TPL。 5. 异常处理和取消操作:在异步编程中,异常处理和取消操作非常重要。学习如何捕获和处理异步操作中可能出现的异常,并了解如何使用 CancellationToken 来取消异步操作。 6. 调试和性能优化:异步编程可能带来一些调试和性能上的挑战。学习如何调试异步代码,并使用适当的技术和工具来优化异步操作的性能。 7. 实践和项目经验:除了理论知识,实践和项目经验也是学习异步编程的关键。尝试编写一些实际的异步代码,并参与或贡献到使用异步编程的项目中,以加深对异步编程的理解和应用。 最重要的是,要不断练习和深入学习,通过阅读相关文档、书籍和参与社区讨论来扩展自己的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值