/// <summary> /// Asynchroner Datenzugriff /// Hinweis: Natürlich gehört Datenzugriffscode normalerweise nicht /// in die Code-Behind-Datei. Aber hier soll es nur darum gehen, auf /// übersichtliche Weise das TA-Pattern zu erklären /// </summary> private async Task<bool> ReadDataAsync(CancellationToken ct) { Status = ""; Print("Beginn ReadDataAsync"); // Datenbankverbindung asynchron aufbauen var conn = new SqlConnection( @"data source=.;initial catalog=WWWings6;integrated security=True; MultipleActiveResultSets=True;App=ADONETClassic"); await conn.OpenAsync(ct); Print("Nach OpenAsync"); // Daten asynchron abrufen var cmd = new SqlCommand("select * from flug", conn); var reader = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection, ct); Print("Nach ExecuteReaderAsync");
// Nur zum Test: Ausführungszeit künstlich verlängern, wenn die // Datenbankabfrage zu schnell ist for (int i = 0; i < 100; i++) { await Task.Delay(50); if (ct.IsCancellationRequested) { Print("Laden wird abgebrochen!"); return false; } }
// Verpacken in DataTable zur Datenbindung an GridView DataTable dt = new DataTable(); dt.Load(reader); C_Daten.ItemsSource = dt.DefaultView;
// Verbindung beenden conn.Close(); Print("Ende ReadDataAsync"); return true; }
private void Print(string s) { int tid = System.Threading.Thread.CurrentThread.ManagedThreadId; string ausgabe = s + " Thread=" + tid; Status += ausgabe + "\n"; System.Diagnostics.Debug.WriteLine(ausgabe); }