栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CancellationToken的多种应用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CancellationToken的多种应用

主要介绍CancellationToken的多种应用。

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

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

3,CancellationToken的回调函数应用。

话不多说,请看代码。

  class Program
    {
 static void Main(string[] args)
 {
     Console.WriteLine("当前线程{0},当前状态{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState);
     //使用线程池创建线程,然后取消线程
     CancelWithThreadPoolMiniSnippet();
 }
 static CancellationTokenSource cts = new CancellationTokenSource();
 static CancellationToken token = cts.Token;
 static void CancelWithThreadPoolMiniSnippet()
 {
     Console.WriteLine("当前线程{0},当前状态{1}", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ThreadState); 

     #region 使用QueueUserWorkItem的构造函数,传递cts.Token,但我不喜欢这个模式 跟踪不了状态
     //ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomeWork), ctn);
     #endregion

     #region 使用传递参数的模式 传递CancellationToken,这里的cts.Token是作为Action的参数传递的
     //var action = new Action(DoSomeWork);
     //Task t = new Task(action, ctn);
     //t.Start();
     //Console.WriteLine("开始,当前线程{0},当前状态{1}", t.GetHashCode(), t.Status);
     #endregion

     #region 使用Task的构造函数,传递cts.Token,但CancellationTokenSource要弄成全局变量,否则方法找不到,就取消不了。
     //Task t = new Task(Work, cts.Token);
     //t.Start();
     #endregion

     #region 注册回调函数,当CancellationTokenSource.Cancel()执行后,调用回调函数 
     token.Register(CallBack, true);  //注册回调函数
     Task t = new Task(Work);
     t.Start();
     #endregion

     Thread.SpinWait(2000000);

     cts.Cancel();
     Console.WriteLine("结束,当前线程{0},当前状态{1}", t.GetHashCode(), t.Status);
     Console.Read();
 }

 static void DoSomeWork(object obj)
 {
     CancellationToken token = (CancellationToken)obj;
     for (int i = 0; i < 100000; i++)
     {
  Console.WriteLine(i);
  // Simulating work.
  //Thread.SpinWait(5000000);

  if (token.IsCancellationRequested)
  {

      break;
  }
     }
 }

 static void Work()
 {

     for (int i = 0; i < 100000; i++)
     {
  Console.WriteLine(i);
  if (token.IsCancellationRequested)
  {

      break;
  }
     }
 }

 static void CallBack()
 {

     Console.WriteLine("I'm call back!"   );
 }
    }

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

到此NET framework4.0里的线程安全就都讲完了,虽然历时好多好多年。。。。。。。

也可能是最近写文字的能力有所提升,不然这线程安全的文章可能还要拖。。。。。。。。

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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号