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}");
    }
    

    执行结果:

    执行结果
    执行结果

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

  • 相关阅读:
    获取表信息(MSSQL)
    合并有数据的列
    isnull的使用方法
    查询SQLServer的启动时间
    查询数据库中有数据的表
    查询数据库中表使用的空间信息。
    SQL Server SA 密码丢失无法连接数据库怎么办?
    tensorflow 语法及 api 使用细节
    Python: PS 滤镜-- Fish lens
    中英文对照 —— 概念的图解
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12884179.html
Copyright © 2011-2022 走看看