标签:
首先应该明白Task的概念-----任务 //这是一种优于Thread,甚至是ThreadPool的东西 而且是默认异步
再来理解async和await:
1、async只是配合await,用来声明异步方法的关键字;
2、async和await之间,await才是关键,直接含义——"异步等待",主线程运行至异步方法内的await处,一般情况下主线程会立即返回上层方法,而await处后续的任务(方法)会新开线程继续执行,新开线程在执行“等待”出任务(方法)结果后,会接着运行完异步方法内await后余下的代码部分。
这就是async和await的核心!!!!
基本结构如下
修饰符+async+返回类型+方法名
{ 非异步的内容
await 任务(Task) : 可以用另外一个方法来返回任务,也可以直接在此利用委托,匿名函数,Lambda表达式来在任务中书写异步代码 都是一样的。
任务结束后执行的内容 这也是在新开的线程中执行。
}
具体见一下代码:
private static void Main(string []args) { //调用异步方法: Console.WriteLine("Main is running on thread" + Thread.CurrentThread.ManagedThreadId); Fun2Async(); Console.WriteLine("瞧!在执行await时,我也回到上层方法了"); Console.ReadKey(); } //异步方法必须用async关键字标识 public static async void FunAsync() { Console.WriteLine("FunAsync is running on thread" + Thread.CurrentThread.ManagedThreadId); //主线程会返回上层方法中继续执行 //await是异步的核心 这个等待功能有非常强大的的作用:1.Task新开线程 2.await用于处理这种异步 await Task.Run(() => { Console.WriteLine("Task is running on thread" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); Console.WriteLine("Task is ended"); }); //Task中的代码执行完毕 下面的代码会继续在新开线程中执行 Console.WriteLine("I was in thread" + Thread.CurrentThread.ManagedThreadId); }
下面来看下其它的表现形式:
//异步方法必须用async关键字标识 public static async void FunAsync() { Console.WriteLine("FunAsync is running on thread" + Thread.CurrentThread.ManagedThreadId); //主线程会返回上层方法中继续执行 //await是异步的核心 这个等待功能有非常强大的的作用:1.Task新开线程 2.await用于处理这种异步 await myTask(); //Task中的代码执行完毕 下面的代码会继续在新开线程中执行 Console.WriteLine("I was in thread" + Thread.CurrentThread.ManagedThreadId); } public static Task myTask() { Console.WriteLine("Now is runing on thread"+Thread.CurrentThread.ManagedThreadId);//特殊情况 这儿会在调用Task的方法中运行,而且比Task先执行, return Task.Run(() => { Console.WriteLine("Task is running on thread" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); Console.WriteLine("Task is ended"); }); }
当然 异步方法可以嵌套使用!!!!!!!!!!!!!!!!!!!
只需要把下级的异步方法写入一个Task当中,再用上级的异步方法await这个Task.
代码如下:
//异步方法必须用async关键字标识 public static async void FunAsync() { Console.WriteLine("FunAsync is running on thread" + Thread.CurrentThread.ManagedThreadId); //主线程会返回上层方法中继续执行 //await是异步的核心 这个等待功能有非常强大的的作用:1.Task新开线程 2.await用于处理这种异步 await myTask(); //Task中的代码执行完毕 下面的代码会继续在新开线程中执行 Console.WriteLine("I was in thread" + Thread.CurrentThread.ManagedThreadId); } public static Task myTask() { //特殊情况 这儿会在调用Task的方法中运行,而且比Task先执行, Console.WriteLine("Now is runing on thread"+Thread.CurrentThread.ManagedThreadId); return Task.Run(() => { Console.WriteLine("Task is running on thread" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); Console.WriteLine("Task is ended"); }); } //下面来异步方法嵌套调用: public static async void ParenAsync() { Console.WriteLine("ParenAsync is running on thread" + Thread.CurrentThread.ManagedThreadId); //这儿使用的是第一个列子的lambda表达式。 await Task.Run(() => { FunAsync();//将低级的异步方法写在了Task中。。。。。 }); Console.ReadKey(); }
一切都是围绕await和Task进行,原理相当简单。
下面总结一下:
1.性能上: Task>ThreadPool>Thread
2.await后接的方法都是Task或Task<T>类型方法,或者直接就是Task对象;
3.传统委托<匿名方法<Lambda表达式 三者内在都是相同的 而且都与传统委托相同。只是后两者更加简洁,方便
Task和Lambda需要继续理解,
标签:
原文地址:http://www.cnblogs.com/Huaran1chendu/p/4851521.html