.NET 4.5新关键字async和await:

.NET 4.5已经发布有段时间了,伴随着而来的是大量的新特性,METRO风格应用程序,MVC4,EF5,等等,其中async/await关键字无疑是其中最亮的部分之一,堪比2.0的泛型,3.0的3W和LINQ,4.0的dynamic。

因为刚刚开始学习C#4.5新特性,所以理解也不透彻,仅仅是了解用法而已。

async关键字用来标记在Calling方法上,表示该方法内部将调用一个异步方法,并且该内部异步方法必须使用await进行标记。简单地看代码。

        static void Main(string[] args)
        {
            ShowMessage();

            Console.ReadLine();
        }

        static void ShowMessage()
        {
            System.Threading.Thread.Sleep(2000);
            Console.WriteLine("Hello World!");
        }

上面的Show方法,因为方法体执行时间较长(Thread.Sleep(int)),必将阻塞主线程,冻结用户界面。

那么,用最新的异步编程方法如何避免这样的情况呢?

        static void Main(string[] args)
        {
            ShowMessage();

            Console.ReadLine();
        }

        static async void ShowMessage()
        {
            await Task.Run(()=>System.Threading.Thread.Sleep(2000));
            Console.WriteLine("Hello World 1!");
        }

如上,只需要在需要长时间执行的方法体上加上async关键字,然后在内部被调用的实际作业方法上加上await关键字,并使用Task.Run(Action)的方式包装实际作业方法即可。

那么,实际执行的过程如何呢?

系统在遇到async关键字时,并不做任何事情,代码继续同步执行,直到真正地遇到await关键字。在遇到await之后,系统利用线程池的线程异步执行被修饰的方法,并在await之后立即返回主线程,主线程继续执行,无需阻塞等待。等到await修饰的异步方法执行完毕后,主线程再切换回await,执行其后剩余的代码。

简单一句话:我们平常见到的程序大多是线性的,从上而下依次执行代码;而async/await关键字修饰的方法中,依然是线性自上而下执行,遇到await关键字后,跳出async标记的方法,让系统自动去执行async中剩余代码,这样,我们就可以不用关心多线程和来回切换的问题,专注于主要线程。

posted @ 2012-09-05 16:24  kennywangjin  阅读(619)  评论(1编辑  收藏  举报