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

    运行结果:

  • 相关阅读:
    jQuery琐碎
    jQuery文档加载事件
    微信,禁止分享页面
    级联下拉列表
    struts2 result随笔
    C++知识点(四)类与对象,结构体、联合体、枚举类
    C++知识点(三)函数
    剑指offer-二叉树
    LeetCode:Remove Element
    LeetCode:Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/sportdog/p/9529632.html
Copyright © 2011-2022 走看看