zoukankan      html  css  js  c++  java
  • 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}");
    }
    

    执行结果:

    执行结果
    执行结果

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

  • 相关阅读:
    BZOJ4779: [Usaco2017 Open]Bovine Genomics
    USACO比赛题泛刷
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    LOJ #10132. 「一本通 4.4 例 3」异象石
    $O(n+log(mod))$求乘法逆元的方法
    BZOJ2226: [Spoj 5971] LCMSum
    数据库 | Redis 缓存雪崩解决方案
    中间件 | 微服务架构
    数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍
    数据库 | SQL语法优化方法及实例详解
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12884179.html
Copyright © 2011-2022 走看看