async/await是C#5.0中推出的html
async用来修饰方法,代表这个方法是异步的,声明的方法的返回类型必须为:void,Task或Task<TResult>。异步
Task<TResult>就是有返回值的Task,TResult就是返回值类型。好比Task<int>async
await必须用来修饰Task或Task<TResult>,并且只能出如今已经用async关键字修饰的异步方法中。post
一般状况下,async/await成对出现才有意义,spa
await能够让主线程等待后台线程执行完毕线程
await不会阻塞主线程code
下面用例子来讲明htm
class Program { static void Main(string[] args) { Console.WriteLine("1:" +Thread.CurrentThread.ManagedThreadId); Console.WriteLine("Main方法执行开始"); Run(); Console.WriteLine("Main方法执行结束"); Console.Read(); } static async void Run() { Console.WriteLine("2:" +Thread.CurrentThread.ManagedThreadId); Console.WriteLine("Run方法执行开始"); await Task.Run(()=> { Console.WriteLine("Task.Run方法执行开始"); Console.WriteLine("3:" +Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10000); Console.WriteLine("Task.Run方法执行结束"); }); Console.WriteLine("4:" +Thread.CurrentThread.ManagedThreadId); Console.WriteLine("Run方法执行结束"); } }
常见错误blog
1 异步方法的返回类型必须为void、Task 或 Task<T>ip
2 若是一个async修饰的方法没有Task.run则会保下面警告
警告CS1998 此异步方法缺乏 "await" 运算符,将以同步方式运行。请考虑使用"await"运算符等待非阻止的API 调用,或者使用"await Task.Run(...)" 在后台线程上执行占用大量CPU 的工做
总结
1 async方法必须有Task.Run异步方法
2 async方法里面一般由await关键字 它用在Task.run前面 做用是告诉主线程 我这边不用你管了 你继续执行你本身的。在await以前仍是属于主线程的。仍是同步的。
3 await代码以前是主线程await以后包括Task.Run以及它后面的代码 都是另一个线程。