每个版本的.net都会引入一些新的特性,这些特性方便开发人员可以快速实现一些功能。虽然.net版本一直在更新,可是新版本对旧版本的程序都是兼容的,在这一点上微软作的仍是很是好的。每次学一个新内容,第一次接触的方法在脑海里占的位置仍是比较重要的,从刚开始接触.net的多线程编程是使用Thread类,而后后面写的程序只要用到异步或者多线程就立刻会想到用Thread,虽然知道委托的异步调用也可以实现,可是脑海里面的排在前面仍是Thread类,在那个时候不知道他们之间的区别和优劣,也就不懂得如何去取舍。到了.net4.0引入了Task这个任务类,让咱们用少许的代码就开始实现了多线程编程,从这个时候开始我也慢慢的了解了.net里面的有哪一些异步实现的方式以及多线程内部的一些机制,也知道它们各自的优点。在接触Task类的时候.net4.5也发布出来了,而且带来一个更加方便的关键字(async,await),轻松实现函数异步调用。虽然知道async和await修饰符,可是本身却迟迟没有接触,由于日常的工做中使用Task类就基本能实现我想要的效果。最近看了一些源码,源码中有不少代码是应用了async和await的关键字来实现异步的,因此我也不得不去学习,接触以后发现,使用async和await关键字确实简化了之前异步编程所须要的步骤,也比较好理解。下面经过一些小例子来简述async和await修饰符如何实现异步编程以及和之前使用Task类来实现异步编程的少量区别。另外,关于.net4.0(包含)之前的的异步编程模式能够参考个人另一篇博文:http://www.cnblogs.com/mingjiatang/p/5267391.htmlhtml
static void Main(string[] args) { AsyncMethod(10);//no.1 Console.WriteLine("执行其余的东西,当前线程id:{0}", Thread.CurrentThread.ManagedThreadId);//out.4 Console.ReadKey(); } static async void AsyncMethod(int i) { Console.WriteLine("异步方法开始,当前线程id:{0}",Thread.CurrentThread.ManagedThreadId);//out.1 await AsyncTaskMethod(i);//no.3 Console.WriteLine("异步方法退出,当前线程id:{0}", Thread.CurrentThread.ManagedThreadId);////out.6 } public static async Task<int> AsyncTaskMethod(int i) { Console.WriteLine("【任务】开始,当前线程id:{0}", Thread.CurrentThread.ManagedThreadId);//out.2 Task<int> t = Task.Run(() => { Console.WriteLine("【任务】正在执行,执行任务的线程id:{0}", i, Thread.CurrentThread.ManagedThreadId);//out.3 Thread.Sleep(2000); return i; });//no.4 int r= await t;//no.5 Console.WriteLine("【任务】执行完成,当前线程id:{0}", i, Thread.CurrentThread.ManagedThreadId);//out.5 return r; }
下面是执行结果:编程
一、异步的方法(包括匿名方法,和lambda表达式)必需要使用async修饰二、异步方法能够具备返回类型的 void, Task,或 Task< TResult> 。该方法不能声明任何 ref 或 出参数,尽管它能够调用具备此类参数的方法。其中返回值为TRsult时,返回类型就是 Task< TResult>。三、await 运算符应用于一个异步方法的任务挂起方法的执行,直到等待任务完成。 任务表示正在进行的工做。四、await 表达式不阻止调用它的线程。 当任务完成时,将会调用其延续任务,而且,异步方法的执行恢复它将会中止的位置。换句话说就是:await会让当前方法等待Task执行完毕再执行。