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

这篇文章运用示例简单讲解C#取消令牌CancellationTokenSource,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

    相信大家在使用C#进行开发的时候,特别是使用异步的场景,多多少少会接触到CancellationTokenSource。看名字就知道它和取消异步任务相关的,而且一看便知大名鼎鼎的CancellationToken就是它生产出来的。不看不知道,一看吓一跳。它在取消异步任务、异步通知等方面效果还是不错的,不仅好用而且够强大。无论是微软底层类库还是开源项目涉及到Task相关的,基本上都能看到它的身影,而微软近几年也是很重视框架中的异步操作,特别是在.NET Core上基本上能看到Task的地方就能看到CancellationTokenSource的身影。这次我们抱着学习的态度,来揭开它的神秘面纱。

简单示例

相信对于CancellationTokenSource基本的使用,许多同学已经非常熟悉了。不过为了能够让大家带入文章的节奏,我们还是打算先展示几个基础的操作,让大家找找感觉,回到那个熟悉的年代。

基础操作

首先呈现一个最基础的操作。

 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; cancellationToken.Register(() => System.Console.WriteLine("取消了???")); cancellationToken.Register(() => System.Console.WriteLine("取消了!!!")); cancellationToken.Register(state => System.Console.WriteLine($"取消了。。。{state}"),"啊啊啊"); System.Console.WriteLine("做了点别的,然后取消了."); cancellationTokenSource.Cancel();

这个操作是最简单的操作,我们上面提到过CancellationTokenSource就是用来生产CancellationToken的,还可以说CancellationToken是CancellationTokenSource的表现,这个待会看源码的时候我们会知道为啥这么说。这里呢我们给CancellationToken注册几个操作,然后使用CancellationTokenSource的Cancel方法取消操作,这时候控制台就会打印结果如下

做了点别的,然后取消了.
取消了。。。啊啊啊
取消了!!!
取消了???

通过上面简单的示例,大家应该非常轻松的理解了它的简单使用。

定时取消

有的时候呢我们可能需要超时操作,比如我不想一直等着,到了一个固定的时间我就要取消操作,这时候我们可以利用CancellationTokenSource的构造函数给定一个限定时间,过了这个时间CancellationTokenSource就会被取消了,操作如下

 //设置3000毫秒(即3秒)后取消 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(3000); CancellationToken cancellationToken = cancellationTokenSource.Token; cancellationToken.Register(() => System.Console.WriteLine("我被取消了.")); System.Console.WriteLine("先等五秒钟."); await Task.Delay(5000); System.Console.WriteLine("手动取消.") cancellationTokenSource.Cancel();

然后在控制台打印的结果是这个样子的,活脱脱的为我们实现了内建的超时操作。

先等五秒钟.
我被取消了.
手动取消.

上面的写法是在构造CancellationTokenSource的时候设置超时等待,还有另一种写法等同于这种写法,使用的是CancelAfter方法,具体使用如下

 CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.Token.Register(() => System.Console.WriteLine("我被取消了.")); //五秒之后取消 cancellationTokenSource.CancelAfter(5000); System.Console.WriteLine("不会阻塞,我会执行.");

这个操作也是定时取消操作,需要注意的是CancelAfter方法并不会阻塞执行,所以打印的结果是

不会阻塞,我会执行.
我被取消了.

关联取消

还有的时候是这样的场景,就是我们设置一组关联的CancellationTokenSource,我们期望的是只要这一组里的任意一个CancellationTokenSource被取消了,那么这个被关联的CancellationTokenSource就会被取消。说得通俗一点就是,我们几个当中只要一个不在了,那么你也可以不在了,具体的实现方式是这样的

 //声明几个CancellationTokenSource CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationTokenSource tokenSource2 = new CancellationTokenSource(); CancellationTokenSource tokenSource3 = new CancellationTokenSource(); tokenSource2.Token.Register(() => System.Console.WriteLine("tokenSource2被取消了")); //创建一个关联的CancellationTokenSource CancellationTokenSource tokenSourceNew = CancellationTokenSource.CreateLinkedTokenSource(tokenSource.Token, tokenSource2.Token, tokenSource3.Token); tokenSourceNew.Token.Register(() => System.Console.WriteLine("tokenSourceNew被取消了")); //取消tokenSource2 tokenSource2.Cancel(); 

上述示例中因为tokenSourceNew关联了tokenSource、tokenSource2、tokenSource3所以只要他们其中有一个被取消那么tokenSourceNew也会被取消,所以上述示例的打印结果是

tokenSourceNew被取消了
tokenSource2被取消了

判断取消

上面我们使用的方式,都是通过回调的方式得知CancellationTokenSource被取消了,没办法通过标识去得知CancellationTokenSource是否可用。不过微软贴心的为我们提供了IsCancellationRequested属性去判断,需要注意的是它是CancellationToken的属性,具体使用方式如下

 CancellationTokenSource tokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = tokenSource.Token; //打印被取消 cancellationToken.Register(() => System.Consol

以上就是运用示例简单讲解C#取消令牌CancellationTokenSource的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程