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)

大家都在看

  • linux学习相关资料整理

    Posted on2022-09-08 13:09 brad1208 阅读(20 ) 评论() 编辑 linux常用指令记录 Python3.9.9安装 supervisor安装与…

    Linux 2023年6月6日
    096
  • Linux基础03

    一些常见目录 usr目录 /usr/local/ # ⽤于保存⽤户安装软件程序信息 相当于windos中D:\Program Files (x86) linux系统安装软件的四种方…

    Linux 2023年6月7日
    092
  • 高等代数:6 二次型 矩阵的合同

    6 二次型 (\cdot) 矩阵的合同 1、定义1:数域K上一个 n元二次型是系数在K中的n个变量的二次齐次多项式,它的一般形式是 [\begin{aligned} &f(…

    Linux 2023年6月8日
    0124
  • IDEA 构建 mybatis 源码

    mybatis 源码构建 mybatis-source 下载 mybatis源码下载 mybatis-parent 版本信息 mybatis-parent 下载 mybatis-p…

    Linux 2023年6月13日
    093
  • 每周一个linux命令(ping)

    基础环境 ping命令介绍 ping&#x547D;&#x4EE4;&#x4E3B;&#x8981;&#x7528;&#x6765;…

    Linux 2023年6月8日
    092
  • UWP Add transport control button to taskbar preview

    I want to add transport control button to taskbar preview, like Netease Music. This is rea…

    Linux 2023年6月13日
    0113
  • 接口

    一.抽象方法及抽象类 1-1 抽象方法 抽象方法:这种方法是不完整的,仅有声明而没有方法体。 public abstract void f(); 1-2 抽象类 包含抽象方法的类一…

    Linux 2023年6月8日
    0101
  • 数据库性能优化八大方案,你知道几个

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。 如果我们有一套成熟的方法论,能让大家快速、准确的去选择…

    Linux 2023年6月13日
    074
  • 6.19(junit–>在maven和Spring中的使用)

    写文章要不忘初心,今天也要继续努力~ 白盒测试:是一种测试用例设计方法,在这里盒子指的是被测试的软件,白盒,顾名思义即盒子是可视的,你可以清楚盒子内部的东西以及里面是如何运作的,因…

    Linux 2023年6月7日
    0100
  • 用无感知的方式为你的数据加上一层缓存

    前言 本篇文章会介绍一个我自己写的库,库地址在这里,主要作用是提供一个注解,在你方法上使用这个注解,库提供的功能会帮你把数据自动缓存起来,下次再调用这个方法只要入参是一致的则直接会…

    Linux 2023年6月14日
    0134
  • GO redis

    csharp;gutter:true; package main</p> <p>import ( "fmt" "github….

    Linux 2023年5月28日
    0100
  • MySQL实现备份(3)之xtrabackup 备份工具

    xtrabackup工具: 是percona公司开发的一个用于对MySQL进行备份的工具。相对于mysqldump,xtrabackup支持增量备份、差异备份等。 使用手册;htt…

    Linux 2023年6月7日
    0130
  • netstat 命令查看端口状态详解

    转载请注明出处: netstat 可以查看服务器当前端口列表及指定端口的连接状态等; -t : 指明显示TCP端口,t是TCP的首字母。 -u : 指明显示UDP端口,u是UDP的…

    Linux 2023年6月14日
    081
  • 在公司当上PD的心路历程

    前不久因为接了个新项目,我被选中当上PD也就是专门负责给客户演示,推进项目、录视频、写文档、做测试,因为我本来就需要测这些东西,熟悉算法、应用、固件,所以大部分人就觉得非我不可。 …

    Linux 2023年6月8日
    098
  • MySQL半同步复制的实现和复制过滤器

    当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。…

    Linux 2023年6月7日
    0102
  • postgre中类似oracle的sql%rowcount用法

    get diagnostics cnt := row_count; 现在有两个表tab1和tab2,两个表的格式相同,tab1中有1000条数据,tab2中0条数据 创建测试功能函…

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