C#线程安全使用(五)

C#线程安全使用(五),第1张

概述CancellationToken的多种应用 这是线程安全的最后一篇了,主要介绍CancellationToken的多种应用。 1,ThreadPool直接启动线程,传递CancellationTok

<div > CancellationToken的多种应用

这是线程安全的最后一篇了,主要介绍CancellationToken的多种应用。

1,ThreadPool直接启动线程,传递CancellationToken。

2,Task启动线程,传递CancellationToken。Task传递方式分为两种,一种通过Task的参数进行传递,另一种通过向线程内传递对象的方式传递CancellationToken。

3,CancellationToken的回调函数应用。

话不多说,请看代码。

#region <a href="https://m.jb51.cc/tag/shiyong/" target="_blank" >使用</a>QueueUserWorkItem的构造<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" >函数</a>,传递cts.Token,但我不喜欢<a href="https://m.jb51.cc/tag/zhege/" target="_blank" >这个</a>模式 跟踪不了状态 //ThreadPo<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>.QueueUserWorkItem(new WaitCallback(DoSomeWork),ctn); #endregion #region <a href="https://m.jb51.cc/tag/shiyong/" target="_blank" >使用</a>传递<a href="https://m.jb51.cc/tag/canshu/" target="_blank" >参数</a>的模式 传递CancellationToken,<a href="https://m.jb51.cc/tag/zheli/" target="_blank" >这里</a>的cts.Token是作为Action的<a href="https://m.jb51.cc/tag/canshu/" target="_blank" >参数</a>传递的 //var action = new Action<object>(DoSomeWork); //Task t = new Task(action,ctn); //t.Start(); //Cons<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>e.Write<a href="https://m.jb51.cc/tag/li/" target="_blank" >li</a>ne("开始,当前线程{0},t.GetHashCode(),t.Status); #endregion #region <a href="https://m.jb51.cc/tag/shiyong/" target="_blank" >使用</a>Task的构造<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" >函数</a>,传递cts.Token,但CancellationTokenSource要弄成<a href="https://www.jb51.cc/tag/quanjubianliang/" target="_blank" >全局变量</a>,否则<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" >方法</a>找不到,就取消不了。 //Task t = new Task(Work,cts.Token); //t.Start(); #endregion #region <a href="https://www.jb51.cc/tag/zhuce/" target="_blank" >注册</a>回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" >函数</a>,当CancellationTokenSource.Cancel()执行后,<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" >调用</a>回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" >函数</a> token.Register(CallBack,true); //<a href="https://www.jb51.cc/tag/zhuce/" target="_blank" >注册</a>回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" >函数</a> Task t = new Task(Work); t.Start(); #endregion Thread.SpinWait(5000000); cts.Cancel(); Cons<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>e.Write<a href="https://m.jb51.cc/tag/li/" target="_blank" >li</a>ne("结束,当前线程{0},t.Status); Cons<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>e.Read(); } static vo<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a> DoSomeWork(object obj) { CancellationToken token = (CancellationToken)obj; for (int i = 0; i < 100000; i++) { Cons<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>e.Write<a href="https://m.jb51.cc/tag/li/" target="_blank" >li</a>ne(i); // Sim<a href="https://m.jb51.cc/tag/ul/" target="_blank" >ul</a>ating work. //Thread.SpinWait(5000000); if (token.IsCancellationRequested) { break; } } } static vo<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a> Work() { for (int i = 0; i < 100000; i++) { Cons<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>e.Write<a href="https://m.jb51.cc/tag/li/" target="_blank" >li</a>ne(i); if (token.IsCancellationRequested) { break; } } } static vo<a href="https://m.jb51.cc/tag/ID/" target="_blank" >ID</a> CallBack() { Cons<a href="https://m.jb51.cc/tag/ol/" target="_blank" >ol</a>e.Write<a href="https://m.jb51.cc/tag/li/" target="_blank" >li</a>ne("I'm call back!" ); }}

代码内执行结果如下,该结果为CancellationToken的回调函数应用:

到此NET Framework4.0里的线程安全就都讲完了。。。。。。。

虽然第一篇文章是2013年,虽然历时近五年,但请相信我,代码早在五年前就已经写完啦。只是我一直一直一直没配文字发出来。。。。。。

不过,也可能是最近写文字的能力有所提升,所以就完成了四和五。

不然这线程安全的文章可能还要拖。。。。。。。。哈哈

在NET Framework4.6里,微软提供了async和await语法,也是有关线程安全,我将会在新的语法相关文章里讲解async和await的用法。

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

总结

以上是内存溢出为你收集整理的C#线程安全使用(五)全部内容,希望文章能够帮你解决C#线程安全使用(五)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存