1.用async标记的异步方应该使用await关键子来制定挂起点。await操做符会告诉编译器,这个async方法在完成以前,后面的代码没法继续执行,同时,控制权转移到async方法的调用者html
2.一个async方法里一般包含一个或多个的对应的await操做符,但若是没有await表达式也不会致使编译错误。但若是调用一个async方 法,却不使用await关键字来标记一个挂起点的话,程序将会忽略async关键字并以同步的方式执行编程
3.若是指定Task<TResult>为返回结果,那么这个方法必须包含return指定的TResult结果的语句。多线程
若是使用Task做为返回值,那么这个方法应该不存在使用return语句返回结果的代码,或者返回的结果不参与任何运算(包括赋值操做)异步
4.async和await关键字并不会建立额外的线程,async方法不会去请求多线程操做。真正建立线程的操做是由Task.Run()实现的async
5.在一个async方法的内部 当调用异步请求(httpClient.SendAsync)以后开始处理主线程的其余任务,最后在须要异步操做返回结果的地方Awaite等待异步操做的完成 期间 httpClient.SendAsync任务和主线程中的任务是并行运行的(因此能够充分利用Cpu的资源)有两种状况会发生A.在调用Awaite时SendAsync的异步任务已经完成了这个时候await responseMsgTask是在主线程中的,B在awaite时SendAsync的异步任务还未完成这个时候主线程的任务会被阻塞 直到异步任务完成后从新激活主线程的后续任务 这个时候await responseMsgTask是在异步线程中的异步编程
6.Await后的代码能够认为是放在隐藏Task中ContinueWith段来运行post
语法糖!!!ui
不过对于winform来讲,确实比之前老是begininvolve到主线程方便许多。spa
private async void button1_Click(object sender, EventArgs e) { var qq = getContent(); textBox1.Text = "a"; textBox2.Text = await qq; } private async Task<string> getContent() { await Task.Delay(2000); return "b"; }
转自:http://www.cnblogs.com/chengruhui/archive/2013/02/28/2937356.html线程