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

    线程取消主要使用的是 CancellationTokenSource 对象下的CancellationToken 取消标记,

    代码如下

    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace EFCOREDB
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                #region 线程取消
                TestThreancancel();
                #endregion
                Console.Read();
            }
            #region 线程取消
            /// <summary>
            /// 线程取消
            /// </summary>
            public static void TestThreancancel()
            {
                using CancellationTokenSource source = new CancellationTokenSource();
                ThreadPool.QueueUserWorkItem(_ => TestThreancancel1(source.Token));
                Thread.Sleep(TimeSpan.FromSeconds(3));
                source.Cancel();
    
                using CancellationTokenSource source1 = new CancellationTokenSource();
                ThreadPool.QueueUserWorkItem((_) => { TestThreancancel2(source1.Token); });
                //source1.CancelAfter(TimeSpan.FromSeconds(3));
                Thread.Sleep(TimeSpan.FromSeconds(3));
                source1.Cancel();
    
                using CancellationTokenSource source2 = new CancellationTokenSource();
                ThreadPool.QueueUserWorkItem((_) => { TestThreancancel3(source2.Token); });
                //source2.CancelAfter(TimeSpan.FromSeconds(3));
                Thread.Sleep(TimeSpan.FromSeconds(3));
                source2.Cancel();
            }
    
            /// <summary>
            /// 线程取消
            /// </summary>
            public static void TestThreancancel1(CancellationToken token)
            {
                Console.WriteLine($"第一个线程开始执行");
                for (int i = 0; i < 10; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine($"第一个线程已经取消了。。。");
                        return;
                    }
                    Console.WriteLine($"第一个线程TestThreancancel 输出值:{i}");
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                    //Console.WriteLine($"第一个线程TestThreancancel 输出值:{i}");
                }
                Console.WriteLine($"第一个线程成功执行");
            }
    
            /// <summary>
            /// 线程取消
            /// </summary>
            public static void TestThreancancel2(CancellationToken token)
            {
                Console.WriteLine($"第二个线程开始执行");
                bool isCanceled = false;
                token.Register(() => { isCanceled = true; });
                for (int i = 0; i < 10; i++)
                {
                    if (isCanceled)
                    {
                        Console.WriteLine($"第二个线程已经取消了。。。");
                        return;
                    }
                    Console.WriteLine($"第二个线程TestThreancancel 输出值:{i}");
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                    //Console.WriteLine($"第二个线程TestThreancancel 输出值:{i}");
                }
                Console.WriteLine($"第二个线程成功执行");
            }
    
            /// <summary>
            /// 线程取消
            /// </summary>
            public static void TestThreancancel3(CancellationToken token)
            {
                Console.WriteLine($"第三个线程开始执行");
                try
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Console.WriteLine($"第三个线程TestThreancancel 输出值:{i}");
                        token.ThrowIfCancellationRequested();
                        Thread.Sleep(TimeSpan.FromSeconds(1));
                        //Console.WriteLine($"第三个线程TestThreancancel 输出值:{i}");
                    }
                    Console.WriteLine($"第三个线程成功执行");
                }
                catch (OperationCanceledException)
                {
                    Console.WriteLine($"第三个线程已经取消了。。。");
                }
            }
            #endregion
        }
    }
    龙腾一族至尊龙骑
  • 相关阅读:
    Log4net在类库中调用写法
    ruby问题
    C#获取项目程序路径的方法
    Redis数据类型
    WCF身份验证之用户名密码认证
    Log4Net 配置和使用
    Windows 下配置ruby on rails环境
    动态网页转静态化的方法
    如何确认Devkit是否安装成功
    AS400中加入各种颜色
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/14042738.html
Copyright © 2011-2022 走看看