Parallele Programmierung mit PLINQ und .NET 4.0
» Von , 09.03.2010 15:12.
Da die Schnittstelle ParallelEnumerable alle LINQ-Erweiterungsmethoden implementiert, ist keine weitere Anpassung erforderlich und eine bislang sequentiell ausgeführte LINQ-Abfrage wird parallel ausgeführt. Auch wenn das Beispiel in Listing 1 anschaulich demonstriert, dass der Umgang mit PLINQ sehr einfach sein kann, müssen einige Punkte besonders beachtet werden.
Fehlerbehandlung mit AggregateException
Die gleichzeitige Ausführung von Programmcode bedeutet auch, dass zeitgleich mehrere Fehler auftreten können. Um diese behandeln zu können, werden alle Fehler von der Ausführungsumgebung gesammelt und einer AggregateException hinzugefügt, die entsprechend behandelt werden muss. Listing 2 zeigt, wie im Rahmen einer Fehlerbehandlung auf alle über diese Ausnahme zur Verfügung gestellten aufgetretenen Fehler zugegriffen wird. Bevor mit der Fehlerbehandlung begonnen werden kann, wird die Methode Flatten aufgerufen. Sie extrahiert unter anderem verschachtelte Fehler, da eine AggregateExcetion selbst wieder AggregateExceptions enthalten könnte. Die Methode Handle wird für jede enthaltene Exception aufgerufen. Kann die Exception behandelt werden, gibt die eigene Fehlerbehandlungsroutine true zurück, ansonsten false. Nicht behandelbare Fehler werden erneut ausgelöst und müssen weiter oben im Aufrufstapel behandelt werden.
Listing 2: Fehlerbehandlung bei einer parallelen Abfrage
static void ExceptionHandling()
{
try
{
var result = Enumerable.Range(1, 200).ToArray().AsParallel()
.Select(i => {
if (i > 51)
throw new Exception("Unknown Error");
if (i > 50)
throw new IndexOutOfRangeException("Zahl ist zu hoch: " + i);
return i;
}).ToArray();
}
catch (AggregateException age)
{
age.Flatten().Handle(exc =>
{
if (exc is IndexOutOfRangeException)
{
Console.WriteLine(exc.Message);
return true;
}
return false;
});
}
}



KOMMENTARE
KOMMENTAR SCHREIBEN