1、await和.Result获取返回结果有何不同?
答:得到的结果没有不同,但是.Result 在某种情况下会造成死锁。
await 时是释放线程,线程能去执行其它任务;.Result 就是让线程暂停,等待结果。
尽量不要用.Result
2、await和task.wait有何不同?
答:两者都是等待返回task执行完的结果,比如都返回string,而不是task<string>,但是wait会阻塞当前线程,await不会阻塞当前线程
主调用方法执行到await的时候,Task如果已经完成,则会返回一个已完成状态的Task对象,并且继续执行await的下一条语句,就像同步一样。
主调用方法执行到await的时候,Task如果还未完成,编译器把await后面的语句生成delegate,写入相应的状态信息。直到任务完成,会有一个SynchronizationContext类恢复delegate运行的情境到await之前的样子(控制台是没有SynchronizationContext的)。
一定要等候任务的执行结果,否则有异常也不会抛出来。
尽量不要使用void作为异步方法的返回值,无法catch异常。
Task.Wait()、Task.Result等候Task执行完毕,才往下跑,但是会让当前线程阻塞。