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

執行結果:

執行結果
執行結果

通過執行結果,我們可以看到,我們是執行了所有的耗時任務,並且再最耗時的接口執行完之後,就會返回所有的結果集. 這種寫法在很多場景下都會提高執行速度.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章