async & await

關於 4.5中新增的異步編程新特性總結

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線程

相關文章
相關標籤/搜索