标签:
来自:http://www.cnblogs.com/lekko/archive/2013/03/05/2944282.html 本人是从.NET4.0刚出的时候接触的.NET环境,所以学的东西就是4.0及其之前的。时代飞速前进,目测5.0也快出了吧,但一直也没去接受新的技术。最近由于要学习Web API,快看完了,却发现4.5已经大行其道了,于是又进行补脑。async与await便是其中之一: 这是两个关键字,用于异步编程。我们传统的异步编程方式一般是Thread、ThreadPool、BeginXXX、EndXXX等等。把调用、回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问题,在.NET 4.5中,新推出的async、await关键字,可以帮助我们像写同步方法一样去写异步方法(保证代码的整齐清晰)。 先来看个传统同步方法例子: 复制代码 1 static void Main(string[] args) 2 { 3 // 同步方式 4 Console.WriteLine("同步方式测试开始!"); 5 SyncMethod(0); 6 Console.WriteLine("同步方式结束!"); 7 Console.ReadKey(); 8 } 9 10 // 同步操作 11 private static void SyncMethod(int input) 12 { 13 Console.WriteLine("进入同步操作!"); 14 var result = SyancWork(input); 15 Console.WriteLine("最终结果{0}", result); 16 Console.WriteLine("退出同步操作!"); 17 } 18 19 // 模拟耗时操作(同步方法) 20 private static int SyancWork(int val) 21 { 22 for (int i = 0; i < 5; ++i) 23 { 24 Console.WriteLine("耗时操作{0}", i); 25 Thread.Sleep(100); 26 val++; 27 } 28 return val; 29 } 复制代码 可以从右图中看到执行结果,是非常典型的同步执行方法。 async关键字能用在方法、lambda表达式的声明部分,用来标示此方法可能包含await关键字,只有拥有async才能在其内部使用await关键字。异步方法可以具有Task、Task<>或void的返回类型;await关键字则是用于返回值是“可等待”类型(awaitable)的方法或lambda表达式内,“awaitable”可以是任何类型(常见的有Task、Task<>),它必须公开一个GetAwaiter() 方法并且返回有效的”awaiter”。更详细的信息可以参考“关于Async与Await的FAQ”,里面介绍了这些概念与注意事项。 当一个async方法,且内部包含await关键字,它就会在编译的时候成为一个异步方法,如果没有await关键字,则它将只会被当成一个同步方法来执行。如果对其内部实现感兴趣可以参考“异步性能:了解 Async 和 Await 的成本”一文,相信对深入了解这种机制还是有所帮助的。 现在我们尝试使用新出的异步关键字async、await来改造成异步调用: 复制代码 static void Main(string[] args) { // 异步方式 Console.WriteLine("\n异步方式测试开始!"); AsyncMethod(0); Console.WriteLine("异步方式结束!"); Console.ReadKey(); } // 异步操作 private static async void AsyncMethod(int input) { Console.WriteLine("进入异步操作!"); var result = await AsyncWork(input); Console.WriteLine("最终结果{0}", result); Console.WriteLine("退出异步操作!"); } // 模拟耗时操作(异步方法) private static async Task