Task_等待任务完成几种方式
1.0 ContinueWith
在ContinueWith会得到上个任务的结果并且可以用IsFaulted判断上个任务是否出现异常!
var t = Task.Run(() => { throw new Exception(""); }); //如果有异常 t.ContinueWith(c => { if (c.IsFaulted) { Console.WriteLine("发生了异常,但不被系统抛出来了,但是此时获取上个任务的结果会抛出异常"); } }); Console.ReadKey();
2.0 OnCompleted
//先输出 已经开始执行,其次才是第一句 var t = Task.Run(() => { Thread.Sleep(1500); throw new Exception("");}); t.GetAwaiter().OnCompleted(() => { Console.WriteLine("这里是执行完后自动的回调事件"); }); Console.WriteLine("已经开始执行"); Console.ReadKey();
3.0 t.GetAwaiter().GetResult,t.Wait(),t.Result
var t = Task.Run(() => { Thread.Sleep(1500); }); t.GetAwaiter().GetResult(); Console.WriteLine("上面会阻塞线程获取结果"); Console.ReadKey();
4.0 await,这就不演示了,配合async关键字使用!具体可以看我另一篇文章
5.0 Task.WaitAny,Task.WaitAll