浅析C#更改令牌ChangeToken

这篇文章主要介绍了C#更改令牌ChangeToken,文中运用大量代码讲解的非常详细,感兴趣的小伙伴一起来看看这篇文章吧

简单实例

要想更好的了解一个新的知识,首先知道它是做啥的,其次要知道它怎么做。所以还是老规矩,咱们先通过简单的示例开始,这样更方便了解。ChangeToken本身是一个静态类,它的核心入口OnChange方法包含两个参数,一个是传递IChangeToken接口实例来获取令牌,另一个是令牌取消之后进行的回调操作。博主本人知道的关于IChangeToken接口的在CLR中的实现类有两个,分别是CancellationChangeTokenCompositeChangeToken类,接下来咱们就分别介绍一下这两个类的简单使用。

CancellationChangeToken示例

咱们先来演示CancellationChangeToken类的使用方式,这也是默认情况下可以使用ChangeToken的最简单方式。首先定义一个TestCancellationChangeToken类来包装一下CancellationChangeToken,实现如下

 public class TestCancellationChangeToken { private CancellationTokenSource tokenSource; ///  /// 获取CancellationChangeToken实例方法 ///  public CancellationChangeToken CreatChanageToken() { tokenSource = new CancellationTokenSource(); return new CancellationChangeToken(tokenSource.Token); } ///  /// 取消CancellationTokenSource ///  public void CancelToken() { tokenSource.Cancel(); } }

这个类非常简单,包含一个CancellationTokenSource类型的属性,一个创建CancellationChangeToken实例的方法和一个取消CancellationTokenSource的CancelToken方法。注意看实现的CreatChanageToken方法,这个方法每次调用都需要创建一个新的CancellationTokenSource和CancellationChangeToken实例,创建CancellationChangeToken实例需要传递CancellationToken实例。CancelToken方法里是调用的CancellationTokenSource的Cancel方法。接下来我们就来看一下如何使用定义的这个类

 //声明类的实例 TestCancellationChangeToken cancellationChangeToken = new TestCancellationChangeToken(); ChangeToken.OnChange(() => cancellationChangeToken.CreatChanageToken(), () => { System.Console.WriteLine($"{DateTime.Now:HH:mm:ss}被触发可一次"); }); //模拟多次调用CancelToken for (int i = 0; i <3; i++) { Thread.Sleep(1000); cancellationChangeToken.CancelToken(); }

上面的示例演示了通过ChangeToken类使用我们定义的TestCancellationChangeToken类,ChangeToken的OnChange方法传递了创建新CancellationChangeToken实例的方法委托,第二个参数则是取消令牌的回调操作,这样便可以重复的使用取消操作,为了演示效果在循环里重复调用CancelToken方法显示的打印结果是

16:40:15被触发可一次
16:40:16被触发可一次
16:40:17被触发可一次

CancellationChangeToken类是通过ChangeToken实现重复取消触发调用的简单实现,两者将结合的时候需要自己包装一下,因为ChangeToken的第一个参数需要每次获取CancellationChangeToken实例的委托,所以需要将它包装到工作类中。

CompositeChangeToken示例

实际开发中很多时候都需要一些关联的场景,比如我触发了一个取消操作,我想把和这个相关联的其它操作也取消,也就是咱们说的有相关性。CompositeChangeToken正是可以绑定一个相关性的IChangeToken集合,当这个IChangeToken集合中有任何一个实例进行取消操作的时候,当前CompositeChangeToken实例也会执行取消操作,咱们就大致演示一下它的使用方式,首先是定义一个使用类TestCompositeChangeToken来模拟包装CompositeChangeToken实例

 public class TestCompositeChangeToken { //声明一个CancellationTokenSource集合 private List _cancellationTokenSources; ///  /// 获取CompositeChangeToken实例方法 ///  public CompositeChangeToken CreatChanageToken() { //初始化三个CancellationTokenSource实例 var firstCancellationTokenSource = new CancellationTokenSource(); var secondCancellationTokenSource = new CancellationTokenSource(); var threeCancellationTokenSource = new CancellationTokenSource(); //分别注册一个回调操作用于演示 firstCancellationTokenSource.Token.Register(() => System.Console.WriteLine("firstCancellationTokenSource被取消")); secondCancellationTokenSource.Token.Register(() => System.Console.WriteLine("secondCancellationTokenSource被取消")); threeCancellationTokenSource.Token.Register(() => System.Console.WriteLine("threeCancellationTokenSource被取消")); //加入到集合还 _cancellationTokenSources = new List { firstCancellationTokenSource, secondCancellationTokenSource, threeCancellationTokenSource }; //生成CancellationChangeToken集合 var cancellationChangeTokens = _cancellationTokenSources.Select(i => new CancellationChangeToken(i.Token)).ToList(); //传递给CompositeChangeToken var compositeChangeToken = new CompositeChangeToken(cancellationChangeTokens); //给CompositeChangeToken实例注册一个取消回调方便演示 compositeChangeToken.RegisterChangeCallback(state => System.Console.WriteLine("compositeChangeToken被取消"),null); return compositeChangeToken; } ///  /// 取消CancellationTokenSource ///  public void CancelToken() { //方便演示效果在_cancellationT

以上就是浅析C#更改令牌ChangeToken的详细内容,更多请关注0133技术站其它相关文章!

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