zoukankan      html  css  js  c++  java
  • C#线程安全使用(五)

     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<object>(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(5000000);
                
                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里的线程安全就都讲完了。。。。。。。

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

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

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

     后记

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

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

    注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
    若您觉得这篇文章还不错,请点击下方的推荐】,非常感谢!

     

  • 相关阅读:
    Eclipse安装flex插件
    Free download SKP900 update tool & activation tool
    How to installation V145 Renault CAN Clip diagnostic software
    How to setup ELM327 Bluetooth WiFi for Android software Torque
    How to make remote key fob for 2002 BMW 3 series
    2015 FVDI V6.3 Software Free Download
    How to solve the SVDI SN Number Display Problem
    Tested work with China Digiprog 3 4.94 mileage programmer
    Autel MaxiDAS DS708 Fatal Application Error illegal operation
    Remap BMW F11 2010 all ECUs with E-Sys and ENET cable
  • 原文地址:https://www.cnblogs.com/kiba/p/9240389.html
Copyright © 2011-2022 走看看