2016-08-03 4 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

asyncメソッドが完了するのを待つことによって、同期コードのような非同期コードを処理することができます。これは長い間ソフトウェア開発の問題であり、著者がそれを処理する方法は多くのうちの1つです。私の好みの方法ではありませんが、この例も非常に古いかもしれません。 – deltree

答えて

5

私は理解方法、(この場合には、ExecuteReaderAsync及びReadAsync)と呼ばれる方法になるまでブロックを待つ戻ります。

いいえ。 awaitポーズメソッドとを呼び出し元に返します。したがって、ではなく、ReadAsync操作の間、呼び出しスレッドをブロックしません。

という概念の違いです。同期はブロッキングを意味します。Readが完了するまでメソッド呼び出しはスレッドを停止します。シリアルは、一度に1つを意味します。ReadAsyncが完了するまで、メソッドは実行を一時停止します。したがって、共通のawait *Async()パターンはシリアルですが、非同期の方法ではなく、同期的な方法です。

asyncおよびawaitの詳細については、async introを参照してください。

+0

私は文脈のキーワードを「待っている」と思う唯一の人は悪い選択でしたか?私はより良い変種を考えることができません。 –

+1

@ Sergey.quixoticaxis.Ivanov:「async」と「await」のキーワードが彼らのようにデザインされた理由(非公式Q&A)のブログ投稿があります。http://blog.stephencleary.com/ 2011/09/async-ctp-why-do-keywords-work-that-way.html)を参照してください。 –

+0

興味深い投稿、ありがとうございます。 「待つ」の背後にある言語学的推論を大部分は説明しているが、(例えば、意味を維持しながら)「離れる」や「逃げ出す」の代わりに「待っている」という理由の文学的な理由はない。 –

0

これはメソッドを一時的にブロックしますが、UIスレッドは応答し続けます。内部的にC#はメソッドを書き換えます。 awaitの後の部分は種別のコールバックメソッドに変換されます(実際はそうではありませんが、それは想像できます)。このメソッドはすぐにawaitに戻り、非同期操作が終了すると中断したところから再開します。

関連する問題