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