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

执行结果:

执行结果
执行结果

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

posted @ 2020-05-13 18:41  HelloZyjS  阅读(175)  评论(0编辑  收藏  举报