请选择 进入手机版 | 继续访问电脑版

[C#教程] 浅析C#更改令牌ChangeToken

[复制链接]
查看87 | 回复8 | 2021-9-14 10:22:13 | 显示全部楼层 |阅读模式
目次

简单实例

要想更好的相识 一个新的知识,起首 知道它是做啥的,其次要知道它怎么做。以是 还是老例子 ,咱们先通过简单的示例开始,如许 更方便相识 。

  1. ChangeToken
复制代码
本身是一个静态类,它的核心入口
  1. OnChange
复制代码
方法包含两个参数,一个是传递
  1. IChangeToken
复制代码
接口实例来获取令牌,另一个是令牌取消之后举行 的回调操作。博主本人知道的关于IChangeToken接口的在CLR中的实现类有两个,分别是
  1. CancellationChangeToken
复制代码
  1. CompositeChangeToken
复制代码
类,接下来咱们就分别先容 一下这两个类的简单利用 。

CancellationChangeToken示例

咱们先来演示

  1. CancellationChangeToken
复制代码
类的利用 方式,这也是默认环境 下可以利用 ChangeToken的最简单方式。起首 定义一个TestCancellationChangeToken类来包装一下CancellationChangeToken,实现如下

  1. public class TestCancellationChangeToken
  2. {
  3. private CancellationTokenSource tokenSource;
  4. /// <summary>
  5. /// 获取CancellationChangeToken实例方法
  6. /// </summary>
  7. public CancellationChangeToken CreatChanageToken()
  8. {
  9. tokenSource = new CancellationTokenSource();
  10. return new CancellationChangeToken(tokenSource.Token);
  11. }
  12. /// <summary>
  13. /// 取消CancellationTokenSource
  14. /// </summary>
  15. public void CancelToken()
  16. {
  17. tokenSource.Cancel();
  18. }
  19. }
复制代码

这个类非常简单,包含一个CancellationTokenSource范例 的属性,一个创建CancellationChangeToken实例的方法和一个取消CancellationTokenSource的CancelToken方法。留意 看实现的

  1. CreatChanageToken
复制代码
方法,这个方法每次调用都必要 创建一个新的CancellationTokenSource和CancellationChangeToken实例,创建CancellationChangeToken实例必要 传递CancellationToken实例。
  1. CancelToken
复制代码
方法里是调用的CancellationTokenSource的Cancel方法。接下来我们就来看一下怎样 利用 定义的这个类

  1. //声明类的实例
  2. TestCancellationChangeToken cancellationChangeToken = new TestCancellationChangeToken();
  3. ChangeToken.OnChange(() => cancellationChangeToken.CreatChanageToken(), () =>
  4. {
  5. System.Console.WriteLine($"{DateTime.Now:HH:mm:ss}被触发可一次");
  6. });
  7. //模拟多次调用CancelToken
  8. for (int i = 0; i < 3; i++)
  9. {
  10. Thread.Sleep(1000);
  11. cancellationChangeToken.CancelToken();
  12. }
复制代码

上面的示例演示了通过ChangeToken类利用 我们定义的TestCancellationChangeToken类,ChangeToken的

  1. OnChange
复制代码
方法传递了创建新CancellationChangeToken实例的方法委托,第二个参数则是取消令牌的回调操作,如许 便可以重复的利用 取消操作,为了演示结果 在循环里重复调用CancelToken方法表现 的打印结果 是

  1. 16:40:15被触发可一次
  2. 16:40:16被触发可一次
  3. 16:40:17被触发可一次
复制代码

CancellationChangeToken类是通过ChangeToken实现重复取消触发调用的简单实现,两者将联合 的时间 必要 本身 包装一下,由于 ChangeToken的第一个参数必要 每次获取CancellationChangeToken实例的委托,以是 必要 将它包装到工作类中。

CompositeChangeToken示例

实际 开辟 中很多时间 都必要 一些关联的场景,比如我触发了一个取消操作,我想把和这个相干 联的别的 操作也取消,也就是咱们说的有相干 性。

  1. CompositeChangeToken
复制代码
正是可以绑定一个相干 性的IChangeToken集合,当这个IChangeToken集合中有任何一个实例举行 取消操作的时间 ,当前CompositeChangeToken实例也会实行 取消操作,咱们就大致演示一下它的利用 方式,起首 是定义一个利用 类TestCompositeChangeToken来模拟 包装CompositeChangeToken实例

  1. public class TestCompositeChangeToken
  2. {
  3. //声明一个CancellationTokenSource集合
  4. private List<CancellationTokenSource> _cancellationTokenSources;
  5. /// <summary>
  6. /// 获取CompositeChangeToken实例方法
  7. /// </summary>
  8. public CompositeChangeToken CreatChanageToken()
  9. {
  10. //初始化三个CancellationTokenSource实例
  11. var firstCancellationTokenSource = new CancellationTokenSource();
  12. var secondCancellationTokenSource = new CancellationTokenSource();
  13. var threeCancellationTokenSource = new CancellationTokenSource();
  14. //分别注册一个回调操作用于演示
  15. firstCancellationTokenSource.Token.Register(() => System.Console.WriteLine("firstCancellationTokenSource被取消"));
  16. secondCancellationTokenSource.Token.Register(() => System.Console.WriteLine("secondCancellationTokenSource被取消"));
  17. threeCancellationTokenSource.Token.Register(() => System.Console.WriteLine("threeCancellationTokenSource被取消"));
  18. //加入到集合还
  19. _cancellationTokenSources = new List<CancellationTokenSource>
  20. {
  21. firstCancellationTokenSource,
  22. secondCancellationTokenSource,
  23. threeCancellationTokenSource
  24. };
  25. //生成CancellationChangeToken集合
  26. var cancellationChangeTokens = _cancellationTokenSources.Select(i => new CancellationChangeToken(i.Token)).ToList();
  27. //传递给CompositeChangeToken
  28. var compositeChangeToken = new CompositeChangeToken(cancellationChangeTokens);
  29. //给CompositeChangeToken实例注册一个取消回调方便演示
  30. compositeChangeToken.RegisterChangeCallback(state => System.Console.WriteLine("compositeChangeToken被取消"),null);
  31. return compositeChangeToken;
  32. }
  33. /// <summary>
  34. /// 取消CancellationTokenSource
  35. /// </summary>
  36. public void CancelToken()
  37. {
  38. //方便演示效果在_cancellationTokenSources集合随便获取一个取消
  39. _cancellationTokenSources[new Random().Next(_cancellationTokenSources.Count)].Cancel();
  40. }
  41. }
复制代码

这里我定义了一个类,在获取CompositeChangeToken实例的

  1. CreatChanageToken
复制代码
方法中创建了三个CancellationTokenSource实例,然后用这三个实例初始化了一个CancellationChangeToken集合,用这个集合初始化了一个CompositeChangeToken实例,来模拟 集合中的CancellationChangeToken实例和CompositeChangeToken实例的相干 性。
  1. CancelToken
复制代码
方法中随机获取了一个CancellationTokenSource实例举行 取消操作,来更好的演示相干 性。由于 CompositeChangeToken类也实现了IChangeToken接口,以是 用起来都一样,大致如下

  1. //声明类的实例
  2. TestCompositeChangeToken compositeChangeToken = new TestCompositeChangeToken();
  3. ChangeToken.OnChange(() => compositeChangeToken.CreatChanageToken(), () =>
  4. {
  5. System.Console.WriteLine($"{DateTime.Now:HH:mm:ss}被触发可一次");
  6. });
  7. //模拟多次调用CancelToken
  8. for (int i = 0; i < 3; i++)
  9. {
  10. Thread.Sleep(1000);
  11. compositeChangeToken.CancelToken();
  12. }
复制代码

为了演示可以重复触发取消操作,这里依然利用 循环的方式模拟 多次触发。由于 存在相干 性,以是 打印的实行 结果 如下

  1. 12:05:18被触发可一次
  2. compositeChangeToken被取消
  3. secondCancellationTokenSource被取消
  4. 12:05:19被触发可一次
  5. compositeChangeToken被取消
  6. firstCancellationTokenSource被取消
  7. 12:05:20被触发可一次
  8. compositeChangeToken被取消
  9. secondCancellationTokenSource被取消
复制代码

从结果 上可以看到任何一个相干 联CancellationChangeToken实例的CancellationTokenSource实例被取消的话,与其相干 的CompositeChangeToken实例也实行 了取消操作,在有些场景下还是比较实用的。

源码探究

上面我们通过简单的示例大致相识 了ChangeToken是做啥的,以及它怎么利用 。通过名字可以得知,它叫更改令牌,阐明 可以动态产生令牌的值。它涉及到了几个核心的操作相干 分别是IChangeToken接口、CancellationChangeToken、CompositeChangeToken和ChangeToken静态类,通过上面咱们的示例和讲解我们大致相识 了这几个范例 的关系,为了方便阅读和头脑 带入咱们就按照方便明确 的次序 来挨个讲解。

  1. 友情提示:本文设计到粘贴出来的相关源码,这些源码是省略掉一部分过程的。因为我们主要是了解它的实现,无关紧要的代码可能会影响阅读效果。而且这次的GitHub源码地址我更换为https://hub.fastgit.org而没有使用官方的https://github.com,主要是GitHub近期很不稳定经常打不开。fastgit是github的镜像网站,展示的内容是完全一致的,最主要的是打开很流畅。
复制代码

IChangeToken接口

起首 便是

  1. IChangeToken
复制代码
接口,它是整个ChangeToken系列的入口操作,ChangeToken的OnChange操作也是通过它的实现类发起的。它的作用就是获取一个可以更改的令牌,也就是可以重复触发的令牌,咱们就先来看一下它的实现[点击查看源码
回复

使用道具 举报

avatar 云端午节 | 2021-9-14 12:24:42 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

avatar 萍381 | 2021-9-22 03:13:00 | 显示全部楼层
admin楼主的病历本丢我这里了!
回复

使用道具 举报

avatar 历史人物费 | 2021-10-4 21:16:47 | 显示全部楼层
论坛人气好旺!
回复

使用道具 举报

avatar 123456835 | 2021-10-15 22:07:48 | 显示全部楼层
admin楼主的头像是本人吗?
回复

使用道具 举报

好好学习admin楼主的帖子!
回复

使用道具 举报

读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar 卢云i | 昨天 13:13 | 显示全部楼层
写得实在太好了,我唯一能做的就是默默顶贴!
回复

使用道具 举报

avatar 想不到918 | 8 小时前 | 显示全部楼层
太高深了,理解力不够用了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则