WaitAll() 等待任务全部完成,才继续执行
WaitAny() 等待任一 Task 完成,才继续执行
WhenAll() 异步等待集合内的 Task 都完成,不会占用主线程的时间。
WhenAny() 至少等待了一个任务的完成,不会占用主线程的时间。
当方法中有要修改的Task对象的值时,需要等待Async方法执行完,
并且返回值时,才能进行数据的修改。若没有返回值,则会等待Async
方法执行完毕后,得到返回值,才会进行数据的修改。
这里借用http://www.cnblogs.com/liqingwen/p/5866241.html里的代码
class Program
{
private static int time = 0;
private static void Main(string[] args)
{
var t = GetRandomAsync();
Console.WriteLine($"t.{nameof(t.IsCompleted)}: {t.IsCompleted}");
Console.WriteLine("123123");
Console.WriteLine($"Result: {t.Result}");
// 涉及到异步返回值,则会停止进行,并等待结果。
//WaitAll() 等待任务全部完成,才继续执行
//WaitAny() 等待任一 Task 完成,才继续执行
//WhenAll() 异步等待集合内的 Task 都完成,不会占用主线程的时间。
//WhenAny() 至少等待了一个任务的完成。
Console.Read();
}
/// <summary>
/// 获取一个随机数
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private static async Task<int> GetRandomAsync()
{
time++;
var t1 = Task.Run(() =>
{
Thread.Sleep(time * 100);
return new Random().Next();
});
time++;
var t2 = Task.Run(() =>
{
Thread.Sleep(time * 100);
return new Random().Next();
});
//异步等待集合内的 Task 都完成,才进行下一步操作
await Task.WhenAll(new List<Task<int>>() { t1, t2 });
Console.WriteLine($" t1.{nameof(t1.IsCompleted)}: {t1.IsCompleted}");
Console.WriteLine($" t2.{nameof(t2.IsCompleted)}: {t2.IsCompleted}");
return t1.Result + t2.Result;
}
}
可以看到&