C# 对多个任务进行符合管理

背景:上位机对设备进行采集,启动服务时,从数据库中查询设备信息,对每台设备开启采集服务,停止服务时,关闭全部服务。存在特殊情况,某台服务在界面上进行单独的开启或关闭、或新增服务时,支持主动开启。

基于上面业务场景用到,task的复合管理

代码

csharp 复制代码
    internal class Program
    {
        //声明CancellationTokenSource对象
        static CancellationTokenSource masterCancelTokenSource = new CancellationTokenSource();


        //声明CancellationTokenSource对象
        static CancellationTokenSource c1 = new CancellationTokenSource();
        static CancellationTokenSource c2 = new CancellationTokenSource();
        static CancellationTokenSource c3 = new CancellationTokenSource();

        //使用多个CancellationTokenSource进行复合管理
        static CancellationTokenSource compositeCancel1 = CancellationTokenSource.CreateLinkedTokenSource(masterCancelTokenSource.Token, c1.Token);
        static CancellationTokenSource compositeCancel2 = CancellationTokenSource.CreateLinkedTokenSource(masterCancelTokenSource.Token, c2.Token);
        static CancellationTokenSource compositeCancel3 = CancellationTokenSource.CreateLinkedTokenSource(masterCancelTokenSource.Token, c3.Token);

        //程序入口
        static void Main(string[] args)
        {
            Task.Factory.StartNew(MyTask1, compositeCancel1.Token);
            Task.Factory.StartNew(MyTask2, compositeCancel2.Token);
            Task.Factory.StartNew(MyTask3, compositeCancel3.Token);

            Console.WriteLine("请按回车键(Enter)停止");
            while (!masterCancelTokenSource.IsCancellationRequested)
            {
                string key = Console.ReadLine();
                if (key == "1")
                {
                    c1.Cancel();
                }
                else if (key == "2")
                {
                    c2.Cancel();
                }
                else if (key == "3")
                {
                    c3.Cancel();
                }
                else
                {
                    masterCancelTokenSource.Cancel();
                }
            }

            //任意一个 CancellationTokenSource 取消任务,那么所有任务都会被取消。
            //c1.Cancel();

            Console.WriteLine("已停止");
            Console.ReadLine();
        }
        //测试方法
        static void MyTask1()
        {
            //判断是否取消任务
            while (!compositeCancel1.IsCancellationRequested)
            {
                Console.WriteLine($"{DateTime.Now}----111");
                Thread.Sleep(1000);
            }
        }

        //测试方法
        static void MyTask2()
        {
            //判断是否取消任务
            while (!compositeCancel2.IsCancellationRequested)
            {
                Console.WriteLine($"{DateTime.Now}----222");
                Thread.Sleep(1000);
            }
        }
        //测试方法
        static void MyTask3()
        {
            //判断是否取消任务
            while (!compositeCancel3.IsCancellationRequested)
            {
                Console.WriteLine($"{DateTime.Now}----333");
                Thread.Sleep(1000);
            }
        }
    }
相关推荐
海盗12342 小时前
微软技术周报 2026-08-31~09-07:GPT-6 Astra 登陆 Foundry、M365 全球认证故障复盘、C# 15 封闭层级
gpt·microsoft·c#
reasonsummer3 小时前
【办公类-115-01】20260906育儿知识(家园小报)批量制作(2026年9月-2027年6月)
开发语言·数据库·c#
软件黑马王子4 小时前
13.缓存池优化:对象上限配置
开发语言·前端框架·c#
唐青枫4 小时前
C#.NET StructureMap 从依赖注入到项目实战
c#·.net
fujisheng6614 小时前
FUI 编译期装配实践:从反射注册到 Source Generator
c#·unity3d
智码看视界5 小时前
.NET 10 推理大模型TensorSharp 3.3.0 部署实测:纯.NET推理引擎反超llama.cpp 1.5倍,DFlash2提速62%
c#·.net·llama.cpp·.net 10·tensorsharp·本地大模型推理·开源推理引擎
格林威5 小时前
C# 图像异步落盘存储:基于Channel 配合 ArrayPool 实现异步落盘
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测
软件黑马王子5 小时前
11.缓存池优化:窗口布局
开发语言·前端框架·c#
格林威5 小时前
C# 图像使用AVX2指令集:使用OpenCvSharp实现字节图像解压缩速度和map_image算子速度提升
开发语言·图像处理·人工智能·计算机视觉·c#·视觉检测·工业相机