先来介绍一下异步所需要的组件,Async CTP Refres微软在2011年4月13号发布了一个VS2010 的补丁,这个补丁可以运用在Windows Phone 7的开发中,也可以运用在所有的.NET 平台环境中。
CTP有几个新的关键字:
- async: 标记一个函数为异步函数,而这个函数必须返回的是viod ,Task, Task<T> 这三种类型。在一个异步函数的里面,你可以使用await 表达式来等待一个任务。换句话说,把当前的功能的执行过程停止,直到你要求等待的那个任务执行完成。(编程语言负责设置和处理流程的继续)。
- await:让执行流程停止在当前的函数直到返回类型是Task或者Task<T>的函数调用结束,然后执行过程继续到调用await的函数。
- Task:用来展现异步操作和表现出检查当前执行状态所需要的信息或者await函数直到执行到最后。
- TaskEx:允许一些Helper和Utililty方法,让异步代码可以在不同的线程或者await多个任务结束。
下面介绍一个简单异步调用
调用viod类型的异步函数
public static void WriteTxt() { Console.WriteLine("Start Thread---"); WriteLine(); Console.WriteLine("End Thread---"); Console.ReadLine(); }
上面方法中WriteLine() 是async 关键字的异步函数
public static async void WriteLine() { string a = await NewLine(); Console.WriteLine(a); }
在这个方法中 NewLine() 是Task<T>类型的方法,在调用Task<T>类型方法前使用关键字await,可以使这个方法等待NewLine()执行结束了,才执行Console.WriteLine(a).而不影响WriteLine()函数中的Console.WriteLine("End Thread---")执行。
public static Task<string> NewLine() { var task = new Task<string>(() => { Thread.Sleep(5000); return "AAA"; }); task.Start(); return task; }
这段代码是异步的关键,构建一个Task对象,Task<T> 的T就是函数返回的最终类型。就是Task<string> NewLine() 是写具体异步所需要执行的逻辑代码。
这个代码的执行结果应该是