• 003 Task并发案例


    003 Task并发案例

    引出问题

    有的时候,我们我们会执行多个耗时任务,比如我们会请求两三个接口,之后通过一个集合来装载所有的接口的返回值,组成一个大的集合.

    如果我们使用顺序执行的方式来执行这些接口,那么需要依次等待这些接口响应完成,才能组成自己想要的结果集. 这会非常的浪费时间,那有什么办法可以更快的拿到这些结果呢?当然是有的,示例代码如下:

    /// <summary>
     /// 耗时任务1
     /// </summary>
     /// <returns></returns>
     private Task<List<int>> Fun1()
     {
         return Task.Factory.StartNew(() =>
         {
             Thread.Sleep(2000);
             Func<List<int>> cur = () => new List<int>(){1,2,3};
    
             return cur.Invoke();
         });
     }
    
     /// <summary>
     /// 耗时任务2
     /// </summary>
     /// <returns></returns>
     private  Task<List<int>> Fun2()
     {
         return  Task.Factory.StartNew(() =>
         {
             Thread.Sleep(5000);
             Func<List<int>> cur = () => new List<int>() { 4, 5,6 };
    
             return cur.Invoke();
         });
     }
    
     /// <summary>
     /// 耗时任务三
     /// </summary>
     /// <returns></returns>
     private Task<List<int>> Fun3()
     {
         return  Task.Factory.StartNew(() =>
         {
             Thread.Sleep(1000);
             Func<List<int>> cur = () => new List<int>() { 7, 8, 9 };
    
             return cur.Invoke();
         });
     }

    上面我们建立了三个模拟耗时任务的方法,下面我们开始调用这些耗时任务,并拿到返回结果.

    private void Action()
    {
        var st = new Stopwatch();
        st.Start();
        var taskList = new List<Task<List<int>>> {Fun1(), Fun2(), Fun3()};
    
    
    
        //Task.WaitAll(taskList.ToArray());
    
        var emp = Task.WhenAll(taskList);
        var result = emp.Result;
    
        foreach (var item in result)
        {
            foreach (var cur in item)
            {
                Console.WriteLine(cur);
            }
        }
    
        st.Stop();
        Console.Write($"使用时长:{st.ElapsedMilliseconds}");
    }
    

    执行结果:

    执行结果
    执行结果

    通过执行结果,我们可以看到,我们是执行了所有的耗时任务,并且再最耗时的接口执行完之后,就会返回所有的结果集. 这种写法在很多场景下都会提高执行速度.

  • 相关阅读:
    Qt内存回收机制
    Qt坐标系统
    Qt信号与槽的使用
    Qt初始化代码基本说明
    Qt下载、安装及环境搭建
    搭建CentOs7的WebServer
    Laying out a webpage is easy with flex
    Let's write a framework.
    使用go语言开发一个后端gin框架的web项目
    个人总结的J2EE目前知道的涵盖面,从大方向入手,多写单元测试,加强基础
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12884179.html
Copyright © 2020-2023  润新知