zoukankan      html  css  js  c++  java
  • CancellationTokenSource 和 CancellationToken 取消线程

    Main 程序[分别调用三个方法]

     static void Main(string[] args)
            {
                using (CancellationTokenSource cts = new CancellationTokenSource())
                {
                    CancellationToken token = cts.Token;
                    ThreadPool.QueueUserWorkItem(p => AsyncOperation(token));
                    Thread.Sleep(TimeSpan.FromSeconds(2));
                    cts.Cancel();
                };
    
                //休眠两秒,否则主线程结束了,新的线程也会结束
                Thread.Sleep(TimeSpan.FromSeconds(2));
            }
    View Code

    方法一

     static void AsyncOperation(CancellationToken token)
            {
                Console.WriteLine("开始第一个任务");
                for (int i = 0; i < 5; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine(i + ":" + token.IsCancellationRequested.ToString());
                        return;
                    }
                    else
                    {
                        Console.WriteLine(i + ":" + token.IsCancellationRequested.ToString());
                    }
                      
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                }
                Console.WriteLine("任务执行完成");
            }
    View Code

    运行结果

    方法二

     static void AsyncOperation2(CancellationToken token)
            {
                try
                {
                    Console.WriteLine("开始第二个任务");
                    for (int i = 0; i < 5; i++)
                    {
                        token.ThrowIfCancellationRequested();
                        Thread.Sleep(TimeSpan.FromSeconds(1));
                        Console.WriteLine("第二个任务执行完成");
                    }
                }
                catch (OperationCanceledException ex)
                {
                    Console.WriteLine("第二个任务被取消了");
                }
            }
    View Code

    运行结果:

    方法三

      static void AsyncOperation3(CancellationToken token)
            {
                bool cancelflag = false;
                token.Register(() => cancelflag = true);//被取消时cancelflag会设置为True
                Console.WriteLine("开始第三个任务");
                for (int i = 0; i < 5; i++)
                {
                    if (cancelflag == true)
                    {
                        Console.WriteLine("第三个任务被取消了");
                        return;
                    }
                    else
                    {
                        Console.WriteLine(i + ":" + token.IsCancellationRequested.ToString());
                    }
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                }
                Console.WriteLine("第三个任务执行完成");
    
            }
    View Code

    运行结果:

  • 相关阅读:
    gcc
    linux下的多线程,pthread_create函数
    Linux开启ssh服务
    Leaky Images: Targeted Privacy Attacks in the Web
    20199112 2019-2020-2 《网络攻防实践》第 10 周作业
    20199112 2019-2020-2 《网络攻防实践》第 9 周作业
    tinymce下载地址
    element-ui重要参考
    SpringCloud在线教育平台(重要--重要--重要--重要--重要--重要)
    在线教育项目(全)
  • 原文地址:https://www.cnblogs.com/sportdog/p/9529632.html
Copyright © 2011-2022 走看看