ABCD四个顺序执行方法,拓展性延申

今天在群里,有人问
有几个void返回值的方法,但是我想让这几个方法有执行顺序,要怎么处理,ABCD 四个方法,依次执行,但是这几个方法都是无返回值的

这个问题其实很简单,如果方法是同步方法,直接四个方法连续写就好了,比如:

    static void Main()
    {
           A();
           B();
           C();
           D();
    }

但是如果方法里面包含了耗时操作(数据提交或者文件操作等),那么四个这样写就有问题了,执行顺序就错掉了,我们需要利用callback函数来进行操作,但是本着能不动原方法就不动的理念,我们使用Task的OnCompleted事件(.net framework中可以使用BeginInvoke(callback,null))来做处理

由于是没有返回值的方法,我们使用
例如

     static void Main()
    {
           Action action1 = () => {
                Thread.Sleep(1000);
                Console.WriteLine("action1");
            };

            Action action2 = () => {
                Thread.Sleep(2000);
                Console.WriteLine("action2");
            };

            Action action3 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("action3");
            };

            Action action4 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("action4");
            };
            Stack st = new Stack();
            st.Push(action2);
            st.Push(action3);
            st.Push(action4);

            void MyAsynCallback()
            {
                if (st.Count > 0)
                {
                    var action = (Action)st.Pop();
                    Task.Run(action).GetAwaiter().OnCompleted(() =>
                    {
                        MyAsynCallback();
                    });
                }
            }
            Task.Run(action1).GetAwaiter().OnCompleted(() =>
            {
                MyAsynCallback();
            });
            Console.ReadLine();
            //Stack的Pop是先进后出,输出顺序action1 action4 action3 action2
    }

我们可以将Stack改成其他的,比如List、Queue等,自行判断是否需要手动弹出action即可

     static void Main()
    {
           Action action1 = () => {
                Thread.Sleep(1000);
                Console.WriteLine("action1");
            };

            Action action2 = () => {
                Thread.Sleep(2000);
                Console.WriteLine("action2");
            };

            Action action3 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("action3");
            };

            Action action4 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("action4");
            };
            Stack st = new Stack();
            st.Push(action2);
            st.Push(action3);
            st.Push(action4);

            void MyAsynCallback(IAsyncResult async)
            {
                if (st.Count > 0)
                {
                    var action = (Action)st.Pop();
                    action.BeginInvoke(new AsyncCallback(MyAsynCallback),null);
                }
            }
            action1.BeginInvoke(new AsyncCallback(MyAsynCallback), null);
            Console.ReadLine();
            //Stack的Pop是先进后出,输出顺序action1 action4 action3 action2
    }

由于是没有返回值的方法,我们使用
例如

     static void Main()
    {
            Func<int> func1 = () => {
                Thread.Sleep(1000);
                Console.WriteLine("func1");
                return 1;
            };

            Func<int> func2 = () => {
                Thread.Sleep(2000);
                Console.WriteLine("func2");
                return 1;
            };

            Func<int> func3 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("func3");
                return 0;
            };

            Func<int> func4 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("func4");
                return 1;
            };
            Stack st = new Stack();
            st.Push(func2);
            st.Push(func3);
            st.Push(func4);

            void MyAsynCallback(int result)
            {
                if (st.Count > 0 && result > 0)
                {
                    var action = (Func<int>)st.Pop();
                    var task1 = Task.Run(action);
                    task1.GetAwaiter().OnCompleted(() =>
                    {
                        MyAsynCallback(task1.Result);
                    });
                }
            }
            var task = Task.Run(func1);

            task.GetAwaiter().OnCompleted(() =>
            {
                MyAsynCallback(task.Result);
            });
            Console.ReadLine();
            //Stack&#x7684;Pop&#x662F;&#x5148;&#x8FDB;&#x540E;&#x51FA;&#xFF0C;&#x8F93;&#x51FA;&#x987A;&#x5E8F;func1 func4 func3 func2
    }
</int></int></int></int></int>
     delegate int dele_func(int a);
     static void Main()
     {
            Func<int> func1 = () => {
                Thread.Sleep(1000);
                Console.WriteLine("func1");
                return 1;
            };

            Func<int> func2 = () => {
                Thread.Sleep(2000);
                Console.WriteLine("func2");
                return 1;
            };

            Func<int> func3 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("func3");
                return 1;
            };

            Func<int> func4 = () => {
                Thread.Sleep(3000);
                Console.WriteLine("func4");
                return 1;
            };
            Stack st = new Stack();
            st.Push(func2);
            st.Push(func3);
            st.Push(func4);

            void MyAsynCallback(IAsyncResult async)
            {
                dele_func dele_Func2 = (dele_func)async.AsyncState;
                int result = dele_Func2.EndInvoke(async);
                if (st.Count > 0 && result > 0)
                {
                    var action = (Func<int>)st.Pop();
                    dele_func dele_Func1 = new dele_func((int a) => { return action.Invoke(); });
                    IAsyncResult asyncResult1 = dele_Func1.BeginInvoke(0, new AsyncCallback(MyAsynCallback), dele_Func1);
                }
            }
            dele_func dele_Func = new dele_func((int a) => { return func1.Invoke(); });
            IAsyncResult asyncResult = dele_Func.BeginInvoke(0, new AsyncCallback(MyAsynCallback), dele_Func);
            Console.ReadLine();
            //Stack&#x7684;Pop&#x662F;&#x5148;&#x8FDB;&#x540E;&#x51FA;&#xFF0C;&#x8F93;&#x51FA;&#x987A;&#x5E8F;func1 func4 func3 func2
     }
</int></int></int></int></int>

如有问题,欢迎指正

Original: https://www.cnblogs.com/spatxos/p/15892850.html
Author: spatxos
Title: ABCD四个顺序执行方法,拓展性延申

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582912/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在自己的项目中使用PCL

    在自己的项目中使用PCL项目设置:1、创建cpp文件,如pcd_write.cpp,文件内容如下例: #include find_package(PCL 1.3 REQUIRED …

    Linux 2023年5月27日
    068
  • Linux 时间操作及其同步

    本文将以 Arch Linux 为例,讨论 Linux 的时间操作和同步方法。 操作系统的时间 (clock) 由三或四部分决定: 时间值; 是否为 UTC 时间; 时区; (如果…

    Linux 2023年5月27日
    088
  • 操作系统之虚拟内存总结

    前言 操作系统为每个进程提供了一个假象:它拥有属于自己的大量的私有内存,可以有巨大的连续地址空间放入自己的代码和数据。用户程序中访问的地址都是虚拟地址,需要经过操作系统和硬件的协同…

    Linux 2023年6月7日
    0130
  • linux三剑客试题汇总

    1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 2、显示etc目录下以root,centos或者user开头的信息 3、找出/etc/init.d/…

    Linux 2023年5月27日
    0104
  • Docker安装使用–Centos

    前言 Docker安装使用 安装步骤 卸载旧版本 安装utils 配置utils的存储库 安装Docker 安装指定版本Docker 验证安装 官网安装说明 阿里云镜像加速 Doc…

    Linux 2023年6月7日
    078
  • 容器编排,跨集群部署(脚踩2只船)问题研究

    —【前言】— https://www.cnblogs.com/cmt/p/14306142.html 问题来自于博客园,讨论容器编排,跨集群部署(脚踩2只船…

    Linux 2023年6月14日
    0105
  • ArchLinux安装-2022-01-12

    这篇教程,是我基于B站up住theCW的视频教程整理的,其中添加了一些我在安装n次之后的经验(虽然失败过几次,但我现在安装不会再出差错,所以请放心的看此教程) 当然,我认为theC…

    Linux 2023年5月27日
    079
  • 句柄过多导致SSH失败

    现象描述 scp文件的时候,突然有一个节点拷贝失败了。以为免密被修改了,结果一问说原因是:句柄过多。 以前这种情况接触较少,就顺带查了一下资料。 句柄的定义 这个标题隐含的一个前提…

    Linux 2023年6月8日
    092
  • haproxy-详解

    四层: LVS (Linux Virtual Server)HAProxy (High Availability Proxy)Nginx (1.9以上) 七层: HAProxyNg…

    Linux 2023年5月27日
    073
  • Linux快速安装流量监控工具(实用版)

    前言: Linux流量监控工具,在此我推荐两种分别为: 1、nload(推荐)因为个人看着舒服点😂 2、iftop 你可以选择上面两种中的任何一种。下面是这两个版本的简介和安装教程…

    Linux 2023年5月27日
    077
  • 灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场…

    Linux 2023年5月28日
    065
  • 使用GVT-g为KVM添加虚拟显卡渲染3D图形

    0x00 前言 可以在KVM虚拟机看电影、玩游戏哦。 我的环境如下: 0x01 启动GVT-g 要启用IOMMU、i915,编辑grub文件: $ sudo vim /etc/de…

    Linux 2023年5月27日
    092
  • GIT使用说明

    1、Git入门教程 1.1:Git入门与使用 (一) Git介绍与安装 1.2:Git入门与使用 (二) Git相关命令的介绍与使用 1.3:Git入门与使用 (三) 使用GitH…

    Linux 2023年6月13日
    088
  • 个人学习-STL:Set前置-tree

    参考资料: [1]程杰.大话数据结构[M]. [2][美]Robert Sedgewic,Jevin Wayne. 算法Algorithms[M].谢路云译 1.基本脉络: 树实际…

    Linux 2023年6月6日
    089
  • spring-data-redis 2.0 的使用

    在使用Spring Boot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。 Spring Boot2.x 不再使用…

    Linux 2023年5月28日
    0102
  • 每天一个 HTTP 状态码 204

    204 No Content 表示服务器成功地处理了客户端的请求,但是… 204 No Content 204 No Content 表示服务器成功地处理了客户端的请求…

    Linux 2023年6月7日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球