首页 > 其他分享 >NET 封装Task库实现几种生产流程控制

NET 封装Task库实现几种生产流程控制

时间:2023-08-23 15:12:13浏览次数:41  
标签:生产流程 Task cts Worker static go NET children

示例1:串行执行
14:55:34.081 A
14:55:35.085 B
14:55:36.094 C

示例2:A执行完 BC并行,且C执行完继续执行
14:55:58.843 A
14:55:58.875 B
14:55:58.875 C1
14:55:58.875 C2: 100

示例3:A执行完 BC并行
14:56:14.682 A
14:56:15.689 C
14:56:15.692 B

示例4:BC并行全部执行完 A
14:56:33.054 B
14:56:34.062 C
14:56:35.078 A

示例5:BC并行任意执行完 A
14:56:58.431 C成功
14:56:59.445 C
14:56:59.445 A
14:57:00.453 B

示例6:执行超时
14:57:26.555 很可惜,没有完成!

 

using System;
using System.Threading;
using System.Threading.Tasks;
using TaskManage.util;

namespace TaskManage
{
    public class Test
    { 
        static CancellationTokenSource cts = new CancellationTokenSource();
        static ManualResetEvent resetEvent = new ManualResetEvent(true);

        public static async Task Start()
        {
            //Task.Run(() =>
            //{ 
            //});

            //Worker1();// 串行
            //Worker2();// 并行,带继续执行
            //Worker3();// A执行完 BC并行
            //Worker4();// BC并行全部执行完 A
            //Worker5();// BC并行任意执行完 A
            Worker6();// 执行超时 
        }

        static void Log(string msg)
        {
            Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} {msg}");
        }

        static async Task Worker(string name, int time = 1000)
        { 
            await Task.Delay(time);

            if (cts.Token.IsCancellationRequested) return; resetEvent.WaitOne();

            Log(name);
        }   

        // A、B、C依次串行
        // A->B->C
        static async Task Worker1()
        {
            await Worker("A");
            await Worker("B");
            await Worker("C");
        }

        // A、B、C全部并行
        // A
        // B
        // C
        // Completed
        static async Task Worker2()
        {
            //Task firstTask = Task.Run(() => { Console.WriteLine("Step1"); });
            //Action<object> parameterizedMethod = (value) => { Console.WriteLine($"Step2: {value}"); };
            //Task secondTask = firstTask.ContinueWith(prevTask => { parameterizedMethod(42); });
            //Task.WaitAll(firstTask, secondTask);

            children children = new children(cts);
            children.go(() => Worker("A", 1000));
            children.go(() => Worker("B", 1000));

            Action<object> Completed = (value) =>
            { 
                Log($"C2: {value}");
            }; 
            children.go(() => Worker("C1", 1000), Completed, 100);
        }

        // A执行完后,B、C再并行
        //  -->B
        //  |
        //A->
        //  |
        //  -->C
        static async Task Worker3()
        {
            await Worker("A");
            children children = new children(cts);
            children.go(() => Worker("B"));
            children.go(() => Worker("C"));
            //children.wait_all();
        }

        // B、C都并行执行完后,再执行A
        //B--
        //  |
        //  -->A
        //  |
        //C--
        static async Task Worker4()
        {
            //Func<Task> a = () => Worker("A", 1000);
            //Func<Task> b = () => Worker("B", 2000);//Func<Task>
            //Task t1 = Task.Run(a);
            //Task t2 = Task.Run(b);
            //List<Task> lt = new List<Task>();
            //lt.Add(t1);
            //lt.Add(t2);
            //Task.WaitAll(lt.ToArray());
            //Console.WriteLine("WaitAll Done");

            children children = new children(cts);
            children.go(() => Worker("B", 1000));
            children.go(() => Worker("C", 2000));
            children.wait_all();
            await Worker("A");
        }

        // B、C任意一个执行完后,再执行A
        //B--
        //  |
        //  >-->A
        //  |
        //C--
        static async Task Worker5()
        {
            // 不需要知道谁第1
            //children children = new children(cts);
            //children.go(() => Worker("B", 2000));
            //children.go(() => Worker("C", 1000));
            //children.wait_any();
            //await Worker("A");

            // 需要知道谁第1
            children children = new children(cts);
            Task B = Task.Run(() => Worker("B", 2000), cts.Token);
            Task C = Task.Run(() => Worker("C", 1000), cts.Token);
            var task = children.when_any(B, C);
            if (task == B)
            {
                Log("B成功");
            }
            else
            {
                Log("C成功");
            }
            await Worker("A");
        }

        static void Worker6()
        { 
            children children = new children(cts);
            children.go(() => Worker("B", 2000));

            var result = children.when_any(1000).Result;
            if (!result)
            {
                Log("很可惜,没有完成!");
            }
        } 
    }
}

 

标签:生产流程,Task,cts,Worker,static,go,NET,children
From: https://www.cnblogs.com/chen1880/p/17651683.html

相关文章

  • 任务调度工具_Spring Task在SpringBoot中使用教程
    ##SpringTask1.1介绍SpringTask是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。定位:定时任务框架作用:定时自动执行某段Java代码为什么要在Java程序中使用SpringTask?应用场景:1).信用卡每月还款提醒2).银行贷款每月还款提醒3).火车......
  • 如何优雅的使用telnet测试端口连通性
    telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式,虽然telnet支持许多命令,但大部分情况下,我们只是使用它查看目标主机是否打开了某端口(默认是23)。其执行结果有两种:端口未打开$telnet101.199.97.6562715Trying101.199.97.65...telnet:connecttoaddres......
  • 【Netty】关于netty的入门问题
    1、netty是什么2、关于netty中的pipeline.addLast(xxxxHandler)这个xxxHandler是ChannelHandlerAdapter的实现类,ChannelHandlerAdapter有好些方法,也很常见,一直有一些问题,这里加了这么多handler,它在执行的时候,是每一个都会经过的吗?发送的时候会经过吗?响应的时候会经过......
  • 【深度学习 | ResNet核心思想】残差连接 & 跳跃连接:让信息自由流动的神奇之道
    ......
  • .net 记录http请求
    记录http请求环境.net7一、过滤器(Filter)这个过程用的的是操作过滤器(ActionFilter)二、2.1继承IAsyncActionFilter2.2重写OnActionExecutionAsyncOnActionExecutionAsync-在调用操作方法前调用OnActionExecutionAsync(ActionExecutingContext,ActionExecutionDele......
  • dockerfile netcore 示例
    #syntax=docker/dockerfile:1FROMmcr.microsoft.com/dotnet/sdk:7.0asbuild-envWORKDIR/appCOPY..RUNdotnetrestoreRUNdotnetpublish-cRelease-o/publishFROMmcr.microsoft.com/dotnet/aspnet:7.0asruntimeWORKDIR/srcCOPY--from=build......
  • 基于Alexnet深度学习网络的人脸识别算法matlab仿真
    1.算法理论概述一、引言       人脸识别是计算机视觉领域中的一项重要任务,它可以对人类面部特征进行自动识别和验证。近年来,随着深度学习的兴起,基于深度学习的人脸识别算法也得到了广泛的应用。本文将介绍基于Alexnet深度学习网络的人脸识别算法,包括详细的实现步骤和数......
  • SignalR实战:在.NET Framework和.NET Core中如何使用SignalR?
    官网文档:ASP.NETCoreSignalR入门|MicrosoftLearnSignalR开源代码:SignalR·GitHub很多小伙伴问:在前后端分离项目中,后端是.NETCore前端是Vue如何使用SignalR?在前后端不分离项目中,.NETFrameworkMVC项目中又如何使用SignalR技术呢?那就来看看下面这篇文章吧!本文主要介绍Signa......
  • 学习笔记:DSTAGNN: Dynamic Spatial-Temporal Aware Graph Neural Network for Traffic
    DSTAGNN:DynamicSpatial-TemporalAwareGraphNeuralNetworkforTrafficFlowForecastingICML2022论文地址:https://proceedings.mlr.press/v162/lan22a.html代码地址:https://github.com/SYLan2019/DSTAGNN一个用于时空序列预测的交通流量预测模型。可学习的地方:提出......
  • 使用.NET Core进行微服务架构设计
    当谈到构建现代化、可扩展的应用程序架构时,微服务架构已经成为一个备受关注的话题。在这篇博客中,我们将探讨如何使用.NETCore来设计和实现微服务架构,并提供一些示例代码来帮助你入门。什么是微服务架构?微服务架构是一种软件架构模式,其中应用程序被拆分为一组小型、自治的服务,每个......