2016-08-03 142 views
0

我發現這個例子在書中使用async/await東西。可以請別人告訴我等待下面例子中的異步方法有什麼好處?爲什麼要在方法中間等待異步方法?

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand("SELECT * FROM People", connection); 
    await connection.OpenAsync(); 
    SqlDataReader dataReader = **await** command.ExecuteReaderAsync(); 
    while (**await** dataReader.ReadAsync()) 
    { 
    string formatStringWithMiddleName = "Person ({0}) is named {1} {2} {3}"; 
    string formatStringWithoutMiddleName = "Person ({0}) is named {1} {3}"; 
    if ((dataReader["middlename"] == null)) 
    { 
     Console.WriteLine(formatStringWithoutMiddleName, 
     dataReader["id"], 
     dataReader["firstname"], 
     dataReader["lastname"]); 
    } 
    else 
    { 
     Console.WriteLine(formatStringWithMiddleName, 
     dataReader["id"], 
     dataReader["firstname"], 
     dataReader["middlename"], 
     dataReader["lastname"]); 
    } 
    } 
    dataReader.Close(); 
    } 
} 

我只是不能換我的頭解決這個問題。按照我的理解,等待塊被調用(在這種情況下,ExecuteReaderAsync和ReadAsync)返回。調用異步方法並在代碼中間立即阻塞的意義何在?在調用異步方法和返回調用方的結果之間沒有實際執行任何操作? 它比單純做這個更快或更有效率?

....

SqlDataReader dataReader = command.ExecuteReader(); 
     while (dataReader.Read()) 
     { 
      ..... 
+1

通過等待異步方法完成,它們可以像處理同步代碼一樣處理異步代碼。這在很長一段時間裏一直是軟件開發中的一個問題,作者選擇處理這個問題的方式就是其中之一。這不是我喜歡的方式,但這個例子也可能很古老。 – deltree

回答

5

我明白的方式,等待阻塞,直到調用的方法(在此情況下,ExecuteReaderAsync和ReadAsync)返回。

否; await暫停該方法和返回給調用者。因此,而不是ReadAsync操作的持續時間內阻止調用線程。

概念上,它是同步系列之間的差異。同步意味着阻塞:方法調用將停止線程,直到Read完成。串行意味着一次一個:該方法將暫停執行,直至ReadAsync完成。所以,常見的await *Async()模式是串行的,但是採用異步方式,而不是同步方式。

有關asyncawait的更多信息,請參閱我的async intro後。

+0

Btw是我唯一認爲「等待」上下文關鍵字是不好的選擇嗎?我想不出一個更好的變體。 –

+1

@ Sergey.quixoticaxis.Ivanov:我有一篇博客文章,是關於爲什麼'async'和'await'關鍵字按照他們的方式設計的非正式問答(http://blog.stephencleary.com/ 2011/09 /異步-CTP-爲什麼-DO - 關鍵詞工作是-way.html)。 –

+0

有趣的帖子,謝謝。雖然它大多描述了「等待」背後的語言推理,但不是選擇「等待」而不是「離開」或「離開」(同時保留語義)的語言理由。 –

0

這會暫時阻止您的方法,但會保持UI線程的響應。內部C#重寫該方法。 await之後的部分被轉換爲一種回調方法(不是很好,但你可以想象它是)。該方法立即在await處返回,並在異步操作完成時恢復其中止的地方。