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

    执行结果:

    执行结果
    执行结果

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

  • 相关阅读:
    Mysql8.0中caching_sha2_password报错解决
    Centos7 安装mysql-8.0.18(rpm)
    如何有效的清理yum缓存
    虚拟机安装后配置IP地址
    正确计算linux系统内存使用率
    Linux 怎样更改locale语言设置
    linux把EDT时间修改为CST格式
    开放接口的安全验证方案(AES+RSA)
    Linux下JDK中文字体乱码
    服务器http请求https服务时报错解决方案
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12884179.html
Copyright © 2011-2022 走看看