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

    执行结果:

    执行结果
    执行结果

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

  • 相关阅读:
    POJ 2533 Longest Ordered Subsequence
    《程序员面试宝典》读书笔记之单链表和源码
    Windows搭建Sublime Text 3 + Go开发环境
    C++ 11学习(1):lambda表达式

    PHP函数十进制、二进制、八进制和十六进制转换
    MySQL 体系结构
    13.2 UPDATE
    UVA 12493 Stars (欧拉函数--求1~n与n互质的个数)
    springMVC3学习(四)--訪问静态文件如js,jpg,css
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12884179.html
Copyright © 2011-2022 走看看