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);
            }
        }
    }
相关推荐
人工智能AI技术7 分钟前
【C#程序员入门AI】本地大模型落地:用Ollama+C#在本地运行Llama 3/Phi-3,无需云端
人工智能·c#
MyBFuture4 小时前
C#数组详解:一维二维与交错数组
开发语言·windows·c#·visual studio·vision pro
有来技术5 小时前
ASP.NET Core 权限管理系统(RBAC)设计与实现|vue3-element-admin .NET 后端
vue.js·后端·c#·asp.net·.net
张人玉7 小时前
C#WinFrom中show和ShowDialog的区别
开发语言·microsoft·c#
m0_748233177 小时前
C#:微软的现代编程利器
开发语言·microsoft·c#
Traced back7 小时前
SQL Server数据自动清理系统最终版(C# WinForms完整源码)
数据库·c#·.net
人工智能AI技术8 小时前
【C#程序员入门AI】Microsoft Extensions for AI (MEAI):统一LLM调用接口,告别厂商绑定
人工智能·c#
William_cl9 小时前
C# ASP.NET路由系统全解析:传统路由 vs 属性路由,避坑 + 实战一网打尽
开发语言·c#·asp.net
初九之潜龙勿用1 天前
C# 操作Word模拟解析HTML标记之背景色
开发语言·c#·word·.net·office
时光追逐者1 天前
使用 MWGA 帮助 7 万行 Winforms 程序快速迁移到 WEB 前端
前端·c#·.net