2017-04-04 4 views
0

Ich bin verwirrt über das Verhalten dieses Befehls:Wartet "awarte command.ExecuteReaderAsync()" auf den Abschluss der Abfrage vor der Rückgabe?

SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess) 

Ich würde am liebsten die Abfrage am Laufen beginnen und sobald SQL Server welche Ergebnisse beginnt, beginnen sie zu verarbeiten. Dies ist im Gegensatz zu Warten auf alle Ergebnisse von SQL Server zurückgegeben werden. Es scheint, als könnte dies mein Programm um etwa 40% beschleunigen, wenn SQL Server Management Studio die Ergebnisse für meine Abfrage zurückgibt.

Es scheint, dass es möglich sein sollte und einige Orte wie this scheinen darauf hinzuweisen, dass es ist.

Ich bin neu in async Programmierung, aber es scheint mir, wie das Kommando der Leser ruft, einen separaten Thread Ausgründung, es zu tun, dann wartet die ExecuteReader zu beenden, die dann eine SQLDataReader fertig zurückgibt.

Bedeutung, die ohne async dazu ist genau die gleiche Befehl:

SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess) 

Oder die SQLDataReader von ExecuteReader natürlich Streaming unterstützen und nur lange genug warten für den Strom vor der Rückkehr zur Verfügung steht zurückgekehrt? Funktioniert es, ob ich rufe ExecuteReader vs ExecuteReaderAsync?

Vielen Dank im Voraus!

+3

Es gibt keinen separaten Thread, es blockiert gerade nicht den aktuellen Thread, während die IO des Sprechens mit der DB auftritt. Es wartet immer noch darauf, dass die DB zurückkehrt, bevor der folgende Code ausgeführt wird. 'Async' besteht hauptsächlich darin, Threads nicht zu blockieren, damit entweder ein UI-Thread UI-Ereignisse verarbeitet oder ein Server mit blockierten Threads, die neue eingehende Anfragen verarbeiten könnten, überlastet wird. Es kann aber auch verwendet werden, wenn auf andere Threads gewartet wird, um die CPU-gebundene Arbeit ebenfalls zu beenden. – juharr

+3

Seitennotiz: post zeigt Beispiel von * Ausführen * der Abfrage, fragt aber nach * Leseergebnisse * der Abfrage (das ist [NextResultASync] https://msdn.microsoft.com/en-us/library/hh223698 (v = vs.110) .aspx)).Ich bin mir nicht sicher, ob dies nur durch falsch eingefügtes Sample oder Missverständnis dazu, wie Daten abgefragt werden, verursacht wird. Auch die Verwendung von "return" ist möglicherweise verwirrend, da "async" -Funktionen sofort beim ersten echten "have" zurückkommen ... –

+0

Wie kann der von Ihnen angegebene Link Ihre Frage zur Semantik nicht beantworten? Es demonstriert die Verwendung der Methode und beschreibt speziell, wie sie zum Streamen der Ergebnisse verwendet werden kann. Was ist damit, verstehst du nicht? – Servy

Antwort

0

jedoch scheint es mir, wie das Kommando der Leser ruft, einen separaten Thread Ausgründung, es zu tun, dann wartet die ExecuteReader zu beenden, die dann eine SQLDataReader fertig zurückgibt.

Sie are wrong. Welche async Methoden sollen sich tun eine Operation starten, „Pause“ die Ausführung der aktuellen Methode, den aktuellen Thread Freisetzung, und nach der Betrieb verfügbar wird, die Zustandsmaschine wiederherzustellen und rufen Sie die Rest der Methode.

Die Verbindung zum SQL Server ist ein E/A-Vorgang, der im asynchronen Modus ausgeführt werden sollte, da für diesen Vorgang kein Thread .Net erforderlich ist. Nach dem Verbindungsaufbau verhalten sich synchroner und asynchroner Reader genau gleich - wie normale .Net Klassen.

Im Vergleich zur synchronen Version dieser Methode erhalten Sie einen freien Thread zum Zeitpunkt der Verbindung zum SQL-Server und einen geringen Overhead für eine Zustandsmaschine.

Verwandte Themen