await-async asynchrone Programmierung in .NET 4.5 (Teil 2)
Kommentare

Fehlerbehandlung und Abbruch
Im Gegensatz zur Task Parallel Library, die überwiegend aggregierte Ausnahmen auslöst und Fehler zusammenfasst, müssen Fehler, die während einer asynchronen Ausführung

Fehlerbehandlung und Abbruch

Im Gegensatz zur Task Parallel Library, die überwiegend aggregierte Ausnahmen auslöst und Fehler zusammenfasst, müssen Fehler, die während einer asynchronen Ausführung auftreten, anders behandelt werden. Listing 4 zeigt die dafür notwendige Implementierung. Generell wird nur eine einzige Ausnahme ausgelöst, wenn während der asynchronen Ausführung Fehler auftreten. Müssen dennoch alle möglichen Fehler behandelt werden, sind die betroffenen Task-Instanzen separat auszuwerten, wie es im catch-Block zu sehen ist. Bei den gefundenen fehlerhaften Task-Instanzen kann dann der enthaltene Fehler abgerufen und ausgewertet werden.

Methoden, die für das TA-Pattern vorbereitet sind, besitzen in der Regel eine Überladung, über die eine Variable vom Typ CancellationToken übergeben werden kann. Intern wird dann das übergebene Token ausgewertet und bei Bedarf die Methodenausführung abgebrochen. Innerhalb einer TAP-basierten Implementierung gelten die gleichen Mechanismen und Vorgehensweisen.

Zusammenfassung

Die Erweiterungen in .NET 4.5 ermöglichen es auf eine einfache Art und Weise, asynchrone Aufrufe zu realisieren. Mit dem neuen Modell entfallen die ansonsten notwendigen Definitionen mehrerer (Callback-)Methoden. Dadurch bleibt der Quellcode übersichtlicher und besser lesbar. Durch die Unterstützung des Cancellation-Mechanismus ist ein leichter Abbruch aktiver asynchroner Ausführungen möglich.

Listing 1

static FileStream stream = new FileStream("datei", FileMode.Open);
static Byte[] data = new byte[2000];
static void UsingAPM()
{
  stream.BeginRead(data,0,data.Length,
  delegate(IAsyncResult resultAsync) {
    int bytesRead = stream.EndRead(resultAsync);
    stream.Close();
    Console.WriteLine(ASCIIEncoding.ASCII.GetString(data));
  } ,null);
}  

Listing 2

public static void UsingEAP()
{
  WebClient client = new WebClient();
  client.DownloadDataCompleted += new DownloadDataCompletedEventHandler
                                      (client_DownloadDataCompleted);
   client.DownloadDataAsync(new Uri("http://www.dev-sky.net"));
}
static void client_DownloadDataCompleted(object sender,  
                                             DownloadDataCompletedEventArgs e)
{
  // verarbeite Ergebnis  
}  

Listing 3

public async Task
CountLinksOnPageAsync(IList addresses)
{
  int links = 0;
  foreach (var address in addresses) 
  {
    var data = await new WebClient().DownloadDataAsync(address);
    links += CountLinks(data.Length);
  }
  lblLinksCount.Text = string.Format("Anzahl Links {0}", links);
  return links;
}  

Listing 4

Task [] mails = (from contact in contacts
select SendMailAsync(contact)).ToArray();
try
{
  await Task.WhenAll(mails);
}
catch (Exception exc)
{
  foreach(Task error in mails.Where(task => task.IsFaulted))
  {
    // Fehler behandeln  
  }
}  

Marc André Zhou ist als freiberuflicher .NET-Technologieberater tätig. Seine Schwerpunkte sind die .NET-Entwicklung, SharePoint, Softwarearchitekturen und Frameworks. Sie erreichen ihn unter zhou@dev-sky.net.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -