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