Neuigkeiten in der .NET-Klassenbibliothek,Teil 6: Asynchrone Methoden in ADO.NET

Der sechste Artikel der Blog-Serie zu den nicht so bekannten Neuerungen der .NET-Klassenbibliothek behandelt asynchrone Methoden in ADO.NET.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg

Die Version 4.5 der .NET-Framework-Klassenbibliothek enthält 947 neue Klassen. Eine Artikelserie stellt zehn Neuerungen vor, die nicht die großen Bibliotheken betreffen und daher nicht so im Licht der Öffentlichkeit stehen. Nachdem zuletzt das Erstellen von ZIP-Dateien vorgestellt wurde, geht es heute in Teil 6 um asynchrone Methoden in ADO.NET.

Das klassische ADO.NET mit Connection, Command und DataReader hat als Neuerung erfahren, dass man Datenbankoperationen nun in der .NET-4.5-Klassenbibliothek mit dem neuen asynchronen Task-orientierten Entwurfsmuster aufrufen kann. So sind zum Beispiel die in der folgenden Tabelle genannten Methoden neu.

Klasse Bisherige Methode (weiterhin vorhanden) Neue Methode (zusätzlich)
DbConnection (bzw. davon abgeleitete Klassen wie SqlConnection) Open() OpenAsync()
DbCommand (bzw. davon abgeleitete Klassen wie SqlCommand) ExecuteDbDataReader()
ExecuteNonQuery()
ExecuteReader()
ExecuteScalar()
ExecuteDbDataReaderAsync()
ExecuteNonQueryAsync()
ExecuteReaderAsync()
ExecuteScalarAsync()
DbDataReader (bzw. davon abgeleitete Klassen wie SqlDataReader) Read()
NextResult()
ReadAsync()
NextResultAsync()

Keine neuen Methoden gibt es in DbDataAdapter und DataSet – einmal mehr ein Anzeichen mehr, dass das DataSet nicht mehr "State of the Art" ist.

Im folgenden Beispiel werden OpenAsync() und ExecuteReaderAsync() verwendet. Die Ausgabe der Thread-Nummern dient lediglich dazu, die asynchrone Ausführung in verschiedenen Threads zu belegen.

public static void run()
{
Console.WriteLine("Run() #1: Aufruf wird initiiert: Thread=" +
System.Threading.Thread.CurrentThread.ManagedThreadId);
ReadDataAsync();
Console.WriteLine("Run() #2: Aufruf ist erfolgt: Thread=" +
System.Threading.Thread.CurrentThread.ManagedThreadId);
}


/// <summary>
/// Asynchroner Download (Rückgabe: nichts)
/// </summary>
static private async void ReadDataAsync()
{
// Datenbankverbindung asynchron aufbauen
SqlConnection conn = new SqlConnection(@"data source=.;initial
catalog=WWWings6;integrated security=True;
MultipleActiveResultSets=True;App=ADONETClassic");
await conn.OpenAsync();
Console.WriteLine("Nach Open Async: Thread=" +
System.Threading.Thread.CurrentThread.ManagedThreadId);
// Daten asynchron abrufen
SqlCommand cmd = new SqlCommand("select top(10) * from flug", conn);
var reader = await cmd.ExecuteReaderAsync();
Console.WriteLine("Nach ExecuteReaderAsync: Thread=" +
System.Threading.Thread.CurrentThread.ManagedThreadId);
// Daten ausgeben
while (reader.Read())
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(reader["Abflugort"]);
Console.ForegroundColor = ConsoleColor.Gray;
}

// Verbindung beenden
conn.Close();
}
}

Ausgabe des obigen Listings. Punkt #2 wird erreicht, bevor die Daten abgerufen sind.

()