2016-08-03 10 views
0

Ich fand dieses Beispiel mit Async/erwarten Sachen in einem Buch. Könnte mir bitte jemand sagen, was ist der Vorteil von asynchronen Methoden wie im folgenden Beispiel?Warum auf eine asynchrone Methode mitten in einer Methode warten?

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(); 
    } 
} 

Ich kann einfach meinen Kopf nicht um diesen zu wickeln. Die Art, wie ich verstehe, warten Blöcke, bis die Methode aufgerufen (in diesem Fall ExecuteReaderAsync und ReadAsync) zurückgibt. Was ist der Zweck, eine asynchrone Methode aufzurufen und sofort in der Mitte des Codes zu blockieren, ohne tatsächlich etwas zwischen dem Aufruf der asynchronen Methode und dem Punkt zu machen, an dem das Ergebnis an den Aufrufer zurückgegeben wird? Wie ist es schneller oder effizienter als einfach dies zu tun?

....

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

Durch das Warten auf die Beendigung der asynchronen Methode können sie asynchronen Code wie synchronen Code behandeln. Dies war lange Zeit ein Problem in der Softwareentwicklung, und die Art, wie der Autor sich damit auseinandersetzte, ist eine von vielen. Es ist nicht meine bevorzugte Art, aber dieses Beispiel kann auch sehr alt sein. – deltree

Antwort

5

So wie ich das verstehe, warten blockiert, bis die Methode aufgerufen (in diesem Fall ExecuteReaderAsync und ReadAsync) kehrt zurück.

Nein; await wird pause die Methode und Rückkehr an den Aufrufer. Daher blockiert es nicht den aufrufenden Thread für die Dauer der Operation ReadAsync.

Konzeptionell ist es der Unterschied zwischen synchronen und seriellen. Synchron bedeutet Sperren: Der Methodenaufruf stoppt den Thread, bis die Read abgeschlossen ist. Seriell bedeutet eins nach dem anderen: Die Methode pausiert die Ausführung, bis die ReadAsync abgeschlossen ist. So ist das gemeinsame await *Async() Muster seriell, aber auf eine asynchrone Weise, keine synchrone Weise. Weitere Informationen zu async und await finden Sie in meinem Beitrag async intro

+0

Btw bin ich der einzige, der denkt, dass kontextuelles Keyword "erwarten" war eine schlechte Wahl? Ich kann mir aber keine bessere Variante vorstellen. –

+1

@ Sergey.quixoticaxis.Ivanov: Ich habe einen Blog-Post, der eine Art von [inoffizielle Q & A auf, warum die 'async' und' erwarten' Schlüsselwörter wurden so gestaltet, wie sie waren] (http://blog.stephencleary.com/ 2011/09/async-ctp-why-do-keywords-work-that-way.html). –

+0

Interessanter Beitrag, danke. Obwohl es hauptsächlich sprachliche Gründe hinter "erwarten" beschreibt, wurde nicht der philologische Grund gewählt, warum "erwarten" gewählt wurde, anstatt zum Beispiel "verlassen" oder "abschweifen von" (während die Semantik beibehalten wird). –

0

Das blockiert vorübergehend Ihre Methode, aber reagiert auf den UI-Thread. Intern schreibt C# die Methode neu. Der Teil nach await wird in eine Art Callback-Methode umgewandelt (naja nicht wirklich, aber man kann sich vorstellen, dass es das war). Die Methode kehrt sofort unter await zurück und wird dort fortgesetzt, wo sie unterbrochen wurde, wenn der asynchrone Vorgang abgeschlossen ist.

Verwandte Themen